SQL Server의 다른 데이터베이스로 복원하는 방법은 무엇입니까?


224

일주일 전부터 Database1 의 백업이 있습니다. 백업은 스케줄러에서 매주 수행되며 .bak파일을 얻습니다 . 이제 일부 데이터를 사용하여 다른 데이터베이스 ( Database2) 로 복원해야합니다 .

나는이 질문을 보았습니다 : 다른 이름으로 같은 PC에서 SQL Server 데이터베이스를 복원 하고 권장 단계는 원래 db의 이름을 바꾸는 것이지만 프로덕션 서버에있을 때 해당 옵션에서 벗어 났으며 실제로는 할 수 없습니다.

Database2해당 .bak 파일의 데이터를 찾아 보거나 찾아내는 다른 방법이 있습니까?

감사.

추신 : 위의 링크에서 두 번째 대답은 유망 해 보였지만 계속 오류로 종료됩니다.

파일 목록 복원이 비정상적으로 종료됩니다

답변:


304

새 db를 만든 다음 덮어 쓰기 옵션을 활성화하는 "복원 마법사"를 사용하거나;

내용을보십시오;

RESTORE FILELISTONLY FROM DISK='c:\your.bak'

결과에서 .mdf & .ldf의 논리적 이름을 적어 둡니다.

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH 
   MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
   MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'

MyTempCopy의 내용으로 데이터베이스를 만듭니다 your.bak.

예 ( 'creditline'이라는 db의 백업을 'MyTempCopy'로 복원합니다.

RESTORE FILELISTONLY FROM DISK='e:\mssql\backup\creditline.bak'

>LogicalName
>--------------
>CreditLine
>CreditLine_log

RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak'
WITH 
   MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf',
   MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'

>RESTORE DATABASE successfully processed 186 pages in 0.010 seconds (144.970 MB/sec).

5
안녕하세요, 뭔가 빠진 것 같습니다. 오류가 계속 발생 backkup set holds a backup of a database other than existing "tmp" database합니다. 이해합니다. to문구가 실제 물리적 경로 여야합니까 MyTempCopy?
LocustHorde 2016 년

홀수, to새 데이터베이스의 db & log 위치, 위의 업데이트 예
Alex K.

52
이 작업을 시도하는 다른 사람은 MyTempCopy를 작성하지 마십시오. 복원 중에 작성됩니다.
Blazes

3
내 경우에는 REPLACE, RECOVERY, 옵션 (SQL2012) cr에서만 작동했습니다. dba.stackexchange.com/questions/51489/…
dc2009

7
이 문제를 해결하려면 REPLACE, RECOVERY를 사용해야합니다. RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak' WITH REPLACE, RECOVERY, MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf', MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'
Raihan

67

SQL Server 2008 R2 :

"복원 : 기존 데이터베이스의 경우 다른 데이터베이스의 백업에서 다음 단계를 수행하십시오.

  1. 도구 모음에서 활동 모니터 단추를 클릭하십시오.
  2. 프로세스를 클릭하십시오. 복원하려는 데이터베이스를 기준으로 필터링하십시오. 각 프로세스를 마우스 오른쪽 단추로 클릭하고 "kill 프로세스"를 선택하여 실행중인 모든 프로세스를 종료하십시오.
  3. 복원하려는 데이터베이스를 마우스 오른쪽 단추로 클릭하고 태스크-> 복원-> 데이터베이스에서를 선택하십시오.
  4. "From Device :"라디오 버튼을 선택하십시오.
  5. ...를 선택하고 복원하려는 다른 데이터베이스의 백업 파일을 선택하십시오.
  6. 백업 세트 왼쪽의 확인란을 선택하여 복원하려는 백업 세트를 선택하십시오.
  7. "옵션"을 선택하십시오.
  8. 기존 데이터베이스 덮어 쓰기 (WITH REPLACE)를 선택하십시오.
  9. 중요 사항 : "다른 이름으로 복원"행 데이터 파일 이름을 덮어 쓰려는 기존 데이터베이스의 파일 이름으로 변경하거나 새 이름을 지정하십시오.
  10. 로그 파일 파일 이름과 동일하게 수행하십시오.
  11. 활동 모니터 화면에서 새로운 프로세스가 생성되지 않았는지 확인하십시오. 만약 그렇다면, 그들을 죽여라.
  12. 확인을 클릭하십시오.

12
MS SQL Server 2010?
Mark

3
여기에 몇 가지 스크린 샷이 있습니다. stackoverflow.com/questions/3829271/…
Tomas Kubes

프로그래머 임에도 불구하고이 마법사를 사용하고 싶습니다. 더 쉽고 깨끗합니다.
v1n1akabozo

1
핵심 단계는 8 번이었습니다. 다니엘 감사합니다.
jbooker

Sql 2014 .. 6a 단계 : 대상 데이터베이스를 복원하려는 데이터베이스로 변경하십시오. 9 단계 및 10 단계 : 대상 데이터베이스를 변경하여이를 관리해야합니다. 그러나 원래 단계 9 & 10에서 설명한대로 파일로 이동하여 파일 이름을 확인하여이를 다시 확인하십시오.
JzInqXc9Dg

49

SQL 서버 2012, SQL Server Management Studio를 사용하여, 나는 다른 데이터베이스 파일 이름을 복원하는 데 유용은 Microsoft 페이지에서 다음 단계를 발견 : (참조 : http://technet.microsoft.com/en-us/library/ms175510 .aspx )

참고 4 단계와 7은 기존 데이터베이스를 덮어 않도록 설정하지하는 것이 중요합니다.


데이터베이스를 새 위치로 복원하고 선택적으로 데이터베이스 이름을 바꾸려면

  1. 적절한 SQL Server 데이터베이스 엔진 인스턴스에 연결 한 다음 개체 탐색기에서 서버 이름을 클릭하여 서버 트리를 확장합니다.
  2. 데이터베이스를 마우스 오른쪽 단추로 클릭 한 다음 데이터베이스 복원 을 클릭하십시오 . 데이터베이스 복원 대화 상자가 열립니다.
  3. 일반 페이지에서 사용하는 소스 복원 할 백업 세트의 원본 및 위치를 지정하는 섹션. 다음 옵션 중 하나를 선택하십시오.

    • 데이터 베이스

      • 드롭 다운 목록에서 복원 할 데이터베이스를 선택하십시오. 이 목록에는 msdb 백업 기록 에 따라 백업 된 데이터베이스 만 포함됩니다 .

        참고 다른 서버에서 백업을 수행하면 대상 서버에 지정된 데이터베이스에 대한 백업 기록 정보가 없습니다. 이 경우 장치를 선택하여 복원 할 파일 또는 장치를 수동으로 지정하십시오.

    • 장치

      • 찾아보기 (...) 버튼을 클릭하여 백업 장치 선택 대화 상자 를 엽니 다 . 에서 백업 미디어 유형 상자에서 나열된 장치 유형 중 하나를 선택합니다. 백업 미디어 상자에 대해 하나 이상의 장치를 선택하려면 추가를 클릭 하십시오 . 백업 미디어 목록 상자에 원하는 장치를 추가 한 후 확인 을 클릭 하여 일반 페이지 로 돌아갑니다 . 에서 장치 : : 소스 데이터베이스 목록 상자에서 복원해야 데이터베이스의 이름을 선택합니다.

        참고이 목록은 장치를 선택한 경우에만 사용할 수 있습니다. 선택한 장치에 백업이있는 데이터베이스 만 사용할 수 있습니다.

  4. 에서 대상 섹션에서 데이터베이스 상자가 자동으로 데이터베이스의 이름이 복원 될 채워집니다. 데이터베이스 이름을 변경하려면 데이터베이스 상자 에 새 이름을 입력하십시오 .
  5. (가)에서 복원 상자로 기본을두고 마지막으로 촬영 한 백업하려면 또는를 클릭 타임 라인 액세스에 백업 타임 라인 수동으로 복구 작업을 중지 시점을 선택하는 대화 상자를.
  6. 복원 할 백업 세트 그리드에서 복원 할 백업을 선택하십시오. 이 그리드는 지정된 위치에서 사용 가능한 백업을 표시합니다. 기본적으로 복구 계획이 제안됩니다. 제안 된 복구 계획을 재정의하기 위해 그리드에서 선택 사항을 변경할 수 있습니다. 이전 백업의 복원에 의존하는 백업은 이전 백업이 선택 해제 될 때 자동으로 선택 해제됩니다.
  7. 데이터베이스 파일의 새 위치를 지정하려면 파일 페이지를 선택한 다음 모든 파일을 폴더로 재배치 를 클릭하십시오 . 데이터 파일 폴더로그 파일 폴더 의 새 위치를 제공하십시오 . 또는 동일한 폴더를 유지하고 데이터베이스 및 로그 파일 이름을 바꾸면됩니다.

3
이것은 매력처럼 작동합니다. 4 단계와 7 단계에 대한 특별한 감사
Anatoly Yakimchuk

또한 '옵션'탭으로 이동하여 '기존 데이터베이스 덮어 쓰기 (WITH REPLACE)'를 확인해야했습니다 ... 그런 다음 작동했습니다.
존 커츠

1
@JohnKurtz는 새 데이터베이스로 복원하는 경우 그렇게 할 필요가 없습니다.
Rots

나는 이미 복원 할 빈 데이터베이스를 만들었습니다. 그것은 차이가되어야합니다.
존 커츠

1
4 단계에서 존재하지 않는 데이터베이스의 이름을 입력하면 설명대로 작동 함을 확인했습니다. 이미 존재하는 다른 데이터베이스를 선택하는 경우 '에서 기존 데이터베이스 덮어 쓰기 (WITH REPLACE)'를 확인해야합니다. 옵션 탭. 양해 해 주셔서 감사합니다.
존 커츠

34

실제로는 "일부 데이터를 사용하고 싶고".bak 파일의 데이터를 탐색하기 때문에 기본 SQL Server 용어로 데이터베이스를 복원 할 필요가 없습니다.

ApexSQL Restore – SQL Server 도구 인 ApexSQL Restore 를 사용하면 SQL Server Management Studio, Visual Studio 또는 기타 타사 도구를 통해 액세스 할 수있는 기본 및 기본 압축 SQL 데이터베이스 백업과 트랜잭션 로그 백업을 모두 라이브 데이터베이스로 연결할 수 있습니다 . 단일 또는 다중 전체, 차등 및 트랜잭션 로그 백업을 첨부 할 수 있습니다

또한 도구가 완전히 작동하는 시험 모드 (14 일) 동안 작업을 수행 할 수 있다고 생각합니다.

면책 조항 : 저는 ApexSQL에서 제품 지원 엔지니어로 일하고 있습니다


9

다음은 물리적 위치를 수정하기 위해 이동 및 백업을 사용하여 데이터베이스를 복사하고 논리적 이름을 수정하기 위해 추가 SQL을 사용하여 다양한 게시물에서 함께 모은 것입니다.

/**
 * Creates (or resets) a Database to a copy of the template database using backup and restore.
 *
 * Usage: Update the @NewDatabase value to the database name to create or reset.
 */

DECLARE @NewDatabase SYSNAME = 'new_db';

-- Set up
USE tempdb;

DECLARE @TemplateBackups SYSNAME = 'TemplateBackups';
DECLARE @TemplateDatabase SYSNAME = 'template_db';
DECLARE @TemplateDatabaseLog SYSNAME = @TemplateDatabase + '_log';

-- Create a backup of the template database
BACKUP DATABASE @TemplateDatabase TO DISK = @TemplateBackups WITH CHECKSUM, COPY_ONLY, FORMAT, INIT, STATS = 100;

-- Get the backup file list as a table variable
DECLARE @BackupFiles TABLE(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId tinyint,CreateLSN numeric(25,0),DropLSN numeric(25, 0),UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0),ReadWriteLSN numeric(25,0),BackupSizeInBytes bigint,SourceBlockSize int,FileGroupId int,LogGroupGUID uniqueidentifier,DifferentialBaseLSN numeric(25,0),DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32));
INSERT @BackupFiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @TemplateBackups + '''');

-- Create  the backup file list as a table variable
DECLARE @NewDatabaseData VARCHAR(MAX);
DECLARE @NewDatabaseLog VARCHAR(MAX);

SELECT @NewDatabaseData = PhysicalName FROM @BackupFiles WHERE Type = 'D';
SELECT @NewDatabaseLog = PhysicalName FROM @BackupFiles WHERE Type = 'L';

SET @NewDatabaseData = REPLACE(@NewDatabaseData, @TemplateDatabase, @NewDatabase);
SET @NewDatabaseLog = REPLACE(@NewDatabaseLog, @TemplateDatabase, @NewDatabase);

RESTORE DATABASE @NewDatabase FROM DISK = @TemplateBackups WITH CHECKSUM, RECOVERY, REPLACE, STATS = 100,
   MOVE @TemplateDatabase TO @NewDatabaseData,
   MOVE @TemplateDatabaseLog TO @NewDatabaseLog;

-- Change Logical File Name
DECLARE @SQL_SCRIPT VARCHAR(MAX)='
    ALTER DATABASE [{NewDatabase}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}'', NEWNAME=N''{NewDatabase}'');
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}_log'', NEWNAME=N''{NewDatabase}_log'');
    ALTER DATABASE [{NewDatabase}] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
    SELECT name AS logical_name, physical_name FROM SYS.MASTER_FILES WHERE database_id = DB_ID(N''{NewDatabase}'');
';
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TemplateDatabase}', @TemplateDatabase);
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{NewDatabase}', @NewDatabase);
EXECUTE (@SQL_SCRIPT);

안녕하세요 NateN, 내 .bak (내 로컬 컴퓨터 d : 드라이브 경로에 있음) 파일을 다른 DB로 복원하고 싶습니다. 단위 테스트를 위해이 코드를 시도했지만 오류가 발생합니다. "데이터베이스로 인해 단독 액세스를 얻을 수 없습니다. "db를 복원 할 수 없습니다 .. 어떻게하는지 알려주세요 ..?
Victor Athoti.

복원중인 데이터베이스를 다른 프로세스에서 사용할 수 없습니다. 데이터베이스에 액세스하는 모든 프로세스를 종료하는 스크립트를 작성하는 방법을 잘 모르겠습니다.
Nathan Niesen

안녕하세요 NateN, 그것은 지금 잘 작동하고 있습니다. 샘플 코드를 사용하고 그 코드에서 약간의 변경을 한 다음 잘 작동합니다 .... 다시 한번 샘플 코드를 제공해 주셔서 감사합니다 ...
Victor Athoti.

1
sql2014 이상의 경우 DECLARE @BackupFiles...라인에 추가 열이 필요합니다.SnapshotURL nvarchar(360)
fiat

3

실제로 동일한 서버로 복원하는 것보다 조금 더 간단합니다. 기본적으로 "데이터베이스 복원"옵션을 살펴보면됩니다. 다음은 튜토리얼입니다.

http://www.techrepublic.com/blog/window-on-windows/how-do-i-restore-a-sql-server-database-to-a-new-server/454

특히 이것은 비 프로덕션 복원이므로 세부 사항에 대해 너무 걱정하지 않고 시도해 보는 것만으로도 편안함을 느낄 수 있습니다. SQL 파일을 원하는 위치에 새 서버에 놓고 원하는 이름을 지정하면 좋습니다.


안녕하세요, 같은 서버, 다른 데이터베이스로 복원해야합니다 ... (복원 데이터베이스의 이름이 다름)
LocustHorde

죄송합니다. 질문을 잘못 읽었습니다. 동일한 기본 원칙이 적용되므로 새 이름과 파일 이름 (mdf, ldf 등)이 달라야합니다.
IAmTimCorey 2016 년

3

데이터베이스가 없으면 다음 코드를 사용하십시오.

ALTER PROCEDURE [dbo].[RestoreBackupToNewDB]    
         @pathToBackup  varchar(500),--where to take backup from
         @pathToRestoreFolder  varchar(500), -- where to put the restored db files 
         @newDBName varchar(100)
    AS
    BEGIN

            SET NOCOUNT ON
            DECLARE @fileListTable TABLE (
            [LogicalName]           NVARCHAR(128),
            [PhysicalName]          NVARCHAR(260),
            [Type]                  CHAR(1),
            [FileGroupName]         NVARCHAR(128),
            [Size]                  NUMERIC(20,0),
            [MaxSize]               NUMERIC(20,0),
            [FileID]                BIGINT,
            [CreateLSN]             NUMERIC(25,0),
            [DropLSN]               NUMERIC(25,0),
            [UniqueID]              UNIQUEIDENTIFIER,
            [ReadOnlyLSN]           NUMERIC(25,0),
            [ReadWriteLSN]          NUMERIC(25,0),
            [BackupSizeInBytes]     BIGINT,
            [SourceBlockSize]       INT,
            [FileGroupID]           INT,
            [LogGroupGUID]          UNIQUEIDENTIFIER,
            [DifferentialBaseLSN]   NUMERIC(25,0),
            [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
            [IsReadOnly]            BIT,
            [IsPresent]             BIT,
            [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
            )
            INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK ='''+ @pathToBackup+'''')
            DECLARE @restoreDatabaseFilePath NVARCHAR(500)
            DECLARE @restoreLogFilePath NVARCHAR(500)
            DECLARE @databaseLogicName NVARCHAR(500)
            DECLARE @logLogicName NVARCHAR(500)
            DECLARE @pathSalt uniqueidentifier = NEWID()

            SET @databaseLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='D') 
            SET @logLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='L')           
            SET @restoreDatabaseFilePath= @pathToRestoreFolder + @databaseLogicName + convert(nvarchar(50), @pathSalt) + '.mdf'
            SET @restoreLogFilePath= @pathToRestoreFolder + @logLogicName + convert(nvarchar(50), @pathSalt) + '.ldf'

            RESTORE DATABASE @newDBName FROM DISK=@pathToBackup     
            WITH 
               MOVE @databaseLogicName TO @restoreDatabaseFilePath,
               MOVE @logLogicName TO @restoreLogFilePath

            SET NOCOUNT OFF
    END

3
  • 이전 데이터베이스를 사용하여 새 데이터베이스를 복원 할 때이 주제와 동일한 오류가 있습니다. (.bak를 사용하면 같은 오류가 발생합니다)

  • 새 데이터베이스의 이름으로 기존 데이터베이스의 이름을 변경했습니다 (이 그림과 동일). 효과가있었습니다.

여기에 이미지 설명을 입력하십시오


2
다음 번에는 은행 이름을 삭제하십시오
Danh

1

다음은 고유 한 db 이름을 가진 추가 db로 백업을 복원하는 방법입니다.

SQL 2005의 경우 이것은 매우 빠르게 작동합니다. 최신 버전도 동일하게 작동합니다.

먼저 원본 DB를 오프라인으로 만들 필요가 없습니다. 그러나 안전을 위해 나는 좋아합니다. 이 예에서는 "billing"데이터베이스의 복제본을 마운트하고 이름은 "billingclone"입니다.

1) 청구 데이터베이스를 올바르게 백업하십시오.

2) 안전을 위해 다음과 같이 원본을 오프라인으로 가져갔습니다.

3) 새 쿼리 창을 엽니 다

**중대한! 모두 완료 될 때까지이 쿼리 창을 열어 두십시오! 이 창에서 DB를 복원해야합니다!

이제 다음 코드를 입력하십시오 :

-- 1) free up all USER databases
USE master;
GO
-- 2) kick all other users out:
ALTER DATABASE billing SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3) prevent sessions from re-establishing connection:
ALTER DATABASE billing SET OFFLINE;

3) 그런 다음 Management Studio에서 rt를 클릭하고 개체 탐색기에서 데이터베이스를 클릭 한 다음 "데이터베이스 복원"을 선택하십시오.

4) "데이터베이스로"필드에 새로운 이름을 입력하십시오. IE 청구 클론

5) 복원 소스에서 "장치에서"를 클릭하고 ... 탐색 버튼을 클릭하십시오.

6) 추가를 클릭하고 백업으로 이동합니다

7) 복원 옆에 확인 표시를합니다 (복원 할 백업 세트 선택).

8) 다음으로 상단 LH 코너에서 OPTIONS 페이지를 선택하십시오.

9) 이제 RESTORE AS에서 데이터베이스 파일 이름을 편집하십시오. db와 로그 모두에 대해이 작업을 수행하십시오. IE billingclone.mdf 및 billingclone_log.ldf

10) 이제 OK를 누르고 작업이 완료 될 때까지 기다립니다.

11) 개체 탐색기에서 새로 고침을 누르면 새 DB가 표시됩니다.

12) 이제 결제 DB를 온라인으로 되돌릴 수 있습니다. 결제를 오프라인으로 전환 할 때 사용한 것과 동일한 쿼리 창을 사용하십시오. 이 명령을 사용하십시오 :

-- 1) free up all USER databases
USE master; GO
-- 2) restore access to all users:
ALTER DATABASE billing SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO
-- 3) put the db back online:
ALTER DATABASE billing SET ONLINE;

끝난!


1
  1. 다른 이름으로 "복사 데이터베이스"옵션을 사용하여 데이터베이스에서 복사
  2. 새로운 복사 데이터베이스 백업
  3. 그것을 복원하십시오!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.