SQL Server 2008 R2 복원 트랜잭션 로그를 사용하여 COPY_ONLY 전체 백업


11

몇 가지 연구를 한 후에이 질문에 대한 답을 찾지 못하는 것 같습니다.

배경 다음 세 가지 요구 사항에 맞는 백업 계획을 설정하려고합니다.

  1. 야간 전체 백업이있는 백업의 안정성
  2. 에서 복원 할 수있는 트랜잭션 로그 백업
  3. 적은 디스크 공간 사용
  4. 감사 도구를 위해 백업에 로컬로 액세스 할 수 있어야합니다

따라서 이러한 요구를 충족시키기 위해 매주 전체 백업, 차등 백업 및 시간별 트랜잭션을 생각하고 있습니다. 그런 다음 매일 밤 오프 사이트로 배송 할 수있는 copy_only 백업이 실행되고,이 백업은 로그 체인이 손상되지 않도록 수행되며, 로컬 디스크 공간을 많이 차지하지 않고도 안정적인 야간 전체 백업을 오프 사이트로 수행합니다.

질문 copy_only 백업에서 복원하고 이후에 트랜잭션 로그를 복원 할 수 있습니까?

내가 무슨 말을하는지 알 수 있도록 예를 들어 보겠습니다.

아래 목록을 사용하여 FullbackupCOPY_ONLYC.bak 다음에 TransactionbackupG.trn, TransactionbackupH.trn, 마지막으로 TransactionbackupI.trn을 복원 할 수 있는지 궁금합니다.

> ---List of Backups---   
FullbackupA.bak 01/01/2013 00:00:00   
>  DifferntialbackupA.bak 02/01/2013 00:00:00 
FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00
>     TransactionbackupA.trn 02/01/2013 01:00:00
>     TransactionbackupB.trn 02/01/2013 02:00:00
>     TransactionbackupC.trn 02/01/2013 03:00:00
>  DifferntialbackupB.bak 03/01/2013 00:00:00 
FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00
>     TransactionbackupD.trn 03/01/2013 01:00:00
>     TransactionbackupE.trn 03/01/2013 02:00:00
>     TransactionbackupF.trn 03/01/2013 03:00:00
>  DifferntialbackupC.bak 04/01/2013 00:00:00 
FullbackupCOPY_ONLYC.bak 04/01/2013 00:00:00
>     TransactionbackupG.trn 04/01/2013 01:00:00
>     TransactionbackupH.trn 04/01/2013 02:00:00
>     TransactionbackupI.trn 04/01/2013 03:00:00

어쩌면이 전체 설정이 합리적이지 않을 수도 있습니다 .SQL Server를 처음 접했을 때 배우려고합니다. 조언이나 도움을 주시면 감사하겠습니다.

답변:


14

SQL Server 2008의 전체 백업은 로그 체인을 손상시키지 않습니다. 차등 base-lsn 만 재설정합니다.

사본에서만 복원 한 후 로그 백업을 복원 할 수도 있습니다. 다음 스크립트는 다음을 시연합니다.

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

데이터베이스와 테이블을 작성하고 해당 테이블에 50 개의 행을 삽입합니다. 이러한 인서트 사이에서 다음과 같은 순서로 여러 백업이 수행됩니다.

  1. 완전한
  2. 로그
  3. 완전한
  4. 전체 사본 _ 만
  5. 로그

다음으로 데이터베이스가 삭제되고 다음과 같이 복원됩니다.

  1. 첫 번째 전체
  2. 첫번째 로그
  3. 두 번째 로그

다음 SELECT은 복원이 성공했음을 보여줍니다.

이는 COP_ONLY전체 백업 또는 일반 전체 백업이 로그 체인을 중단 하지 않음을 나타냅니다 .

그런 다음 데이터베이스가 다시 삭제되고 다음과 같이 복원됩니다.

  1. Copy_Only Full
  2. 두 번째 로그

그 후 SELECT다시 성공을 보여줍니다.

이는 COPY_ONLY전체 백업을 로그 복원의 기본으로 사용할 수 있음을 보여줍니다 .

차동 테스트

나는 또한 DIFFERENTIAL버전을 만들었다 :

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_3' WITH DIFFERENTIAL,INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F1, D1, D2',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_1' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore FC, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F2, D2, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

백업은 다음 순서로 수행됩니다.

  1. 첫 번째 전체
  2. 1 차 미분
  3. 두 번째 전체
  4. 2 차 미분
  5. Copy_Only Diff
  6. 3 차 미분

그런 다음이 복원 경로를 시도합니다.

  1. 첫 번째 전체
  2. 1 차 미분
  3. 2 차 미분

이 오류로 3 단계가 실패합니다.

Msg 3136, Level 16, State 1, Line 4
This differential backup cannot be restored because the database has not been restored to the correct earlier state.

이는 정상적인 전체 백업이 차등 체인을 중단 함을 나타냅니다.

다음으로 데이터베이스가 삭제되고이 복원 플로우가 시도됩니다.

  1. Copy_Only Full
  2. 3 차 미분

2 단계는 위의 3 단계와 동일한 오류로 실패합니다. 이는 사본 전용 백업을 차등 복원의 기본으로 사용할 수 없음을 나타냅니다.

그런 다음 데이터베이스가 다시 삭제되고 다음 복원이 실행됩니다.

  1. 두 번째 전체
  2. 2 차 미분
  3. 3 차 미분

다음 선택은이 복원이 성공했음을 나타냅니다. 이는 COPY_ONLY전체 백업이 차등 체인을 방해하지 않음을 나타냅니다 .


copy_only 전체 백업에 트랜잭션 로그를 적용 할 수 있는지 여부에 대한 정보를 찾고있었습니다. 이것은 정말 좋은 정보입니다!
Brain2000

2

차이가 포함되면 어떻게됩니까?

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 10 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 20 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 30 rows so far
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 40 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 50 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 60 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 70 rows so far
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO


USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70: log chain not broken
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70
GO
DROP DATABASE BakTst13;

한마디로, 예, COPY_ONLY백업을 사용하여 추가 로그 백업을 복원 할 수 있습니다. 수행 할 수없는 것은 COPY_ONLY백업을 차등 기반으로 사용하는 것 입니다. 즉, 복원 된 COPY_ONLY백업 에서 차등 백업을 복원 할 수 없습니다 .

DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;

시도하면 오류가 발생합니다.

Processed 160 pages for database 'BakTst13', file 'BakTst13' on file 1.
Processed 2 pages for database 'BakTst13', file 'BakTst13_log' on file 1.
RESTORE DATABASE successfully processed 162 pages in 0.009 seconds (139.811 MB/sec).
Msg 3136, Level 16, State 1, Line 2
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

차등 백업은 이해하기 어려울 수 있으며 숙련 된 DBA도 속일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.