差分バックアップの問題-なぜですか?これは可能ですか?


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の差分バックアップを復元する場合、毎回完全バックアップと差分バックアップの両方を常に復元する必要がありますか?

WITH RECOVERY完全バックアップは前日にすでに復元されているため、差分バックアップのみを復元しました(そしてそのエラーメッセージが表示されました)。

明確にするために:はい、サーバーBのデータベースを差分間で読み取り可能にします。どうすればそれを回避できますか?毎晩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

/*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'

また、これらの厄介なログファイルとは異なり、差分を復元するときに先にスキップすることもできます。

/*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.