web-dev-qa-db-ja.com

このバックアップセットのログは最近のものですが、最後の完全バックアップの前のものです!

データベースの完全バックアップとトランザクションログを最新のトランザクションログに復元しようとしています。 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分から、「最近」というメッセージが表示され、最も古いメッセージが表示されました。

したがって、このトランザクションログは、最新の完全データベースバックアップよりも半日古いものである必要があります。

ここで何か不足していますか?これはどうして最近のことでしょうか?

どんな助けもありがたいです-そしてこれは本番システムではありません、心配しないでください!

4
alexk

完全バックアップの最後のLSNは、ログバックアップの最後のLSNと一致する必要があります。これが最初のログバックアップで、その後、連続するログバックアップはA.LAST_LSN = B.FIRST_LSN->ここで、B = Aの直後に行われたログバックアップ.

BOLから:

enter image description here

今あなたが得ているエラーを見てください:

ログインこのバックアップセットはLSN 421814812000000025600001で始まりますです。これは、データベースに適用するには最近のことです。 LSNを含む以前のログバックアップ421787067000000013800001を復元できます。

したがって、基本的に、LSNにギャップがあるため、ログバックアップを復元できません。

Restore Gene -を使用して、DBの復元を自動化することをお勧めします。 PowerShellを使用して完全に自動化することもできます。 (私はそれを使用しており、非常に便利です)

完全バックアップとLSNがどのように機能するかについては、 私の回答へ を参照してください。

2
Kin Shah

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 
2
KASQLDBA

SMSSから復元しようとすると、最初のt-logをスキップすることがわかりました。不足しているトランザクションを含めるようにステートメントを変更しましたが、問題はありませんでした。これは、フルバックアップと時間単位のログ(推測に基づく推測)の重複した実行が原因で発生するのでしょうか?

1
Andrew