データベースの完全バックアップとトランザクションログを最新のトランザクションログに復元しようとしています。 15分ごとに発送されるようにトランザクションログを設定しました。このセットアップは、SMSS GUIを介して実行されました。データベース全体のバックアップは毎日午前12時に始まり、通常は午前2時より前に終了します。
最初に、NORECOVERYを使用して完全バックアップを復元します。
USE [master]
RESTORE DATABASE [DBNAME] FROM DISK = N'X:\path\to\DBNAME.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 5
GO
これは正常に完了します。
次に、最も古いトランザクションログを取得して、次のコマンドを実行します。
RESTORE LOG DBNAME FROM DISK = 'X:\path\to\OldestTransactionLog.trn' WITH NORECOVERY;
ただし、次のエラーが発生します。
Msg 4305, Level 16, State 1, Line 10
The log in this backup set begins at LSN 421814812000000025600001, which is too recent to apply to the database. An earlier log backup that includes LSN 421787067000000013800001 can be restored.
Msg 3013, Level 16, State 1, Line 10
RESTORE LOG is terminating abnormally.
なぜこれが最近過ぎるのかわかりません!
バックアップは午前12時に行われ、午前2時に終了します。
最初にトランザクションログを午前12時から試しましたが、昨日午前11時30分から、「最近」というメッセージが表示され、最も古いメッセージが表示されました。
したがって、このトランザクションログは、最新の完全データベースバックアップよりも半日古いものである必要があります。
ここで何か不足していますか?これはどうして最近のことでしょうか?
どんな助けもありがたいです-そしてこれは本番システムではありません、心配しないでください!
完全バックアップの最後のLSNは、ログバックアップの最後のLSNと一致する必要があります。これが最初のログバックアップで、その後、連続するログバックアップはA.LAST_LSN
= B.FIRST_LSN
->ここで、B = Aの直後に行われたログバックアップ.
BOLから:
今あなたが得ているエラーを見てください:
ログインこのバックアップセットはLSN 421814812000000025600001で始まりますです。これは、データベースに適用するには最近のことです。 LSNを含む以前のログバックアップ421787067000000013800001を復元できます。
したがって、基本的に、LSNにギャップがあるため、ログバックアップを復元できません。
Restore Gene -を使用して、DBの復元を自動化することをお勧めします。 PowerShellを使用して完全に自動化することもできます。 (私はそれを使用しており、非常に便利です)
完全バックアップとLSNがどのように機能するかについては、 私の回答へ を参照してください。
LSN 421814812000000025600001で終了するログファイルをLSN 421787067000000013800001で復元されたDBに適用しようとしているため、フルバックアップ(復元)のLSNは適用しようとしているログファイルよりも古いです。したがって、ログファイルは適用できず、順序が変更されます。
ここで考えられる原因は、トランザクションログのバックアップを順番どおりに復元していないことです。
また、以下のスクリプトを使用して、使用可能なバックアップを順番に復元するかどうかを決定できます。前述のとおり here
USE Master;
GO
SET NOCOUNT ON
-- 1 - Variable declaration
DECLARE @dbName sysname
DECLARE @backupPath NVARCHAR(500)
DECLARE @cmd NVARCHAR(500)
DECLARE @fileList TABLE (backupFile NVARCHAR(255))
DECLARE @lastFullBackup NVARCHAR(500)
DECLARE @lastDiffBackup NVARCHAR(500)
DECLARE @backupFile NVARCHAR(500)
-- 2 - Initialize variables
SET @dbName = 'Customer'
SET @backupPath = 'D:\SQLBackups\'
-- 3 - get list of files
SET @cmd = 'DIR /b ' + @backupPath
INSERT INTO @fileList(backupFile)
EXEC master.sys.xp_cmdshell @cmd
-- 4 - Find latest full backup
SELECT @lastFullBackup = MAX(backupFile)
FROM @fileList
WHERE backupFile LIKE '%.BAK'
AND backupFile LIKE @dbName + '%'
SET @cmd = 'RESTORE DATABASE ' + @dbName + ' FROM DISK = '''
+ @backupPath + @lastFullBackup + ''' WITH NORECOVERY, REPLACE'
PRINT @cmd
-- 4 - Find latest diff backup
SELECT @lastDiffBackup = MAX(backupFile)
FROM @fileList
WHERE backupFile LIKE '%.DIF'
AND backupFile LIKE @dbName + '%'
AND backupFile > @lastFullBackup
-- check to make sure there is a diff backup
IF @lastDiffBackup IS NOT NULL
BEGIN
SET @cmd = 'RESTORE DATABASE ' + @dbName + ' FROM DISK = '''
+ @backupPath + @lastDiffBackup + ''' WITH NORECOVERY'
PRINT @cmd
SET @lastFullBackup = @lastDiffBackup
END
-- 5 - check for log backups
DECLARE backupFiles CURSOR FOR
SELECT backupFile
FROM @fileList
WHERE backupFile LIKE '%.TRN'
AND backupFile LIKE @dbName + '%'
AND backupFile > @lastFullBackup
OPEN backupFiles
-- Loop through all the files for the database
FETCH NEXT FROM backupFiles INTO @backupFile
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'RESTORE LOG ' + @dbName + ' FROM DISK = '''
+ @backupPath + @backupFile + ''' WITH NORECOVERY'
PRINT @cmd
FETCH NEXT FROM backupFiles INTO @backupFile
END
CLOSE backupFiles
DEALLOCATE backupFiles
-- 6 - put database in a useable state
SET @cmd = 'RESTORE DATABASE ' + @dbName + ' WITH RECOVERY'
PRINT @cmd
SMSSから復元しようとすると、最初のt-logをスキップすることがわかりました。不足しているトランザクションを含めるようにステートメントを変更しましたが、問題はありませんでした。これは、フルバックアップと時間単位のログ(推測に基づく推測)の重複した実行が原因で発生するのでしょうか?