태그 보관물: sql-server

sql-server

차등 백업 문제-왜? 이게 가능해? 롤 포워드 할 파일이 없으므로 로그

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)콤보 시퀀스에 대한 유일한 옵션 입니까?

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



답변

당신은 엉망으로 필요하지 않습니다 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

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


답변