차등 백업 문제-왜? 이게 가능해?


13

SQL Server 2014를 사용하고 있으며 이것이 상황입니다.

  • 서버 A와 서버 B가 있습니다.
  • 하룻밤 ETL은 서버 A에서 처리됩니다.
  • 로드 프로세스를 완료 한 후, 데이터베이스 X는-백업 (과 도착 CHECKSUMRESTORE VERIFYONLY서버 B로 전송받을 후 신뢰성을 보장하기) 및
  • 서버 B는 bak파일을 수신 한 다음 데이터베이스를 복원합니다.

차등 백업 전략을 사용하여 다음을 수행합니다.

  1. 전체 백업은 토요일에만 수행됩니다.
    즉 , 토요일 서버 A의 전체 백업-> 서버 B로 발송-> 서버 B에서 전체 백업 복원

  2. 나머지 요일은 차등 백업입니다.
    즉, 서버 A의 차등 백업-> 서버 B로 배송-> 서버 B의 차등 백업 복원

시도했지만 오류가 발생했습니다.

롤 포워드 할 파일이 없으므로 로그 또는 차등 백업을 복원 할 수 없습니다.

이유가 확실하지 않습니다. 나는 확인 sys.database_files서버 A와 서버 B에, 나는 볼 그 수 differential_Base_LSNdifferential_base_GUID동일합니다. 다른 곳이나 확인해야 할 것이 있습니까?

그건 그렇고, 위의 2 단계에서 서버 B의 diff 백업을 복원 할 때마다 항상 전체 백업과 차등 백업을 모두 복원해야합니까?

WITH RECOVERY전체 백업이 전날에 이미 복원 되었기 때문에 차등 백업 만 복원했으며 오류 메시지가 나타납니다.

명확히하기 위해 : 예, 서버 B의 db를 차등 사이에서 읽을 수 있기를 원합니다. 그 문제를 어떻게 해결할 수 있습니까? 매일 밤 RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)콤보 시퀀스에 대한 유일한 옵션 입니까?

어떤 안내라도 대단히 감사하겠습니다.

답변:


15

당신은 엉망으로 필요하지 않습니다 RECOVERY그리고 NORECOVERY당신이 필요로하는 모든이입니다, 여기에 STANDBY옵션을 선택합니다. 사용 방법에 대한 간단한 데모가 있습니다.

데이터베이스를 작성하고 단순 복구로 설정 한 후 테이블을 작성하십시오.

데이터를 삽입하고 약간의 차이가 있습니다.

재미 있지?

USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

그래, 거짓말 했어 지루한 부분입니다.

다음에서 전체 백업을 복원 할 수 있습니다 STANDBY.

/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

다음과 STANDBY같이 순서대로 Diff를 복원 할 수 있습니다 .

/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

그리고 그 성가신 로그 파일과 달리 Diff를 복원 할 때도 건너 뛸 수 있습니다.

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

가독성을 테스트하려면 복원 명령 사이에서 실행하십시오. ID가 각각 증가 할 것입니다. 그렇지 않으면 끔찍한 일을 한 것입니다.

파일을 복원 할 때 데이터베이스에서 최종 사용자를 쫓아 내고 쿼리가 완료 될 때까지 기다리지 않습니다.

또한 데이터베이스를 읽기 전용 상태로 유지하므로 여기에서 변경할 수 없습니다.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

그리고 마지막으로 자신을 정리하십시오.

/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

도움이 되었기를 바랍니다!!

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