差分バックアップを復元すると、DEFUNCTログファイルが作成されますか?


11

これが私の問題です。完全な復元を介してデータベースを新しいサーバーに移動してから、差分バックアップ/復元をすばやく実行しようとしています。問題なく完全に復元できますが、差分バックアップを復元すると、次の警告が表示されます。

メッセージ3127、レベル16、状態1、行1復元されたデータベース 'DatabaseName'のファイル 'Database_Log2'は、データベースが単純復旧モデルを使用しており、ファイルが読み取り/書き込みアクセス用にマークされているため、無効な状態のままです。したがって、断片的な復元で回復できるのは読み取り専用ファイルのみです。

データベースは復元され、オンラインと見なされますが、このDEFUNCTファイルが原因でバックアップ操作が失敗し、次のエラーが発生します。

メッセージ3636、レベル16、状態2、行1データベースID 10ファイルID 6の「BackupMetadata」メタデータの処理中にエラーが発生しました。メッセージ3046、レベル16、状態2、行1一貫性のないメタデータが検出されました。可能なバックアップ操作は、WITH CONTINUE_AFTER_ERRORまたはNO_TRUNCATEオプションを使用したログ末尾のバックアップのみです。メッセージ3013、レベル16、状態1、行1 BACKUP DATABASEが異常終了しています。

フルと差分でRESTORE FILELISTONLYを実行すると、同じ出力が得られます。これは、ソースデータベースのsys.database_filesから見たものと一致します。サーバーはSQL2012 SP1のDeveloperエディションです。

フルバックアップを実行してすぐに差分を作成し、これらのファイルを同じサーバー上の別のデータベースに復元すると、まったく同じ問題が発生するため、差分の作成方法に原因があります。完全バックアップを復元して復元すると問題はありません。このファイルが以前このデータベースに存在していたかどうかはわかりませんが、このファイルが以前から存在し、かなり前に削除された可能性は十分にあります。復元されたデータベースでsys.database_filesを照会すると、DEFUNCTファイルにはdrop_lsnの値があり、これはこれを確認しているようです。現在、ソースデータベースには、ファイルグループ(PRIMARY)が1つ、データファイルが4つ、ログファイルが1つしかありません。

何か案は?


バックアップと復元に使用しているステートメントを教えてください。
Jon Seigel

異常なことはありません。DISK = 'D:\ Full.bak' FROM REPLACE、NORECOVERYを使用してデータベースデータベース名を復元してから、DISK = 'D:\ Diff.bak' WITH RECOVERYを使用してデータベースデータベース名を復元する
FilamentUnities

回答:


5

これを再現する手順を以下に示します。SQL2012 SP1 Developer Editionでテストされています。これはSQL 2008では発生しません。要約すると、モデルデータベースが単純復旧中にSQL 2012で作成されたデータベースは、追加のログファイルが存在する間に完全バックアップが作成され、追加のログファイルが存在する場合、使用可能な差分バックアップを作成できません。削除された。

ALTER DATABASE [model] SET RECOVERY SIMPLE
GO
CREATE DATABASE [DefunctTest]
GO
ALTER DATABASE [DefunctTest] ADD LOG FILE ( NAME = N'DefunctTest_log2', FILENAME = N'D:\DefunctTest_log2.ldf' , SIZE = 25600KB , FILEGROWTH = 10%)
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestPostLogFile.bak' WITH INIT
GO
ALTER DATABASE [DefunctTest]  REMOVE FILE [DefunctTest_log2]
GO

BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestFull.bak' WITH INIT
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestDiff.bak' WITH DIFFERENTIAL, INIT
GO
--Show that the backups only have the one log file.
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestFull.bak'
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestDiff.bak'
GO
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestFull.bak' WITH 
MOVE 'DefunctTest' TO 'D:\DefunctTest2.mdf',
MOVE 'DefunctTest_log' TO 'D:\DefunctTest2_log.ldf', REPLACE, NORECOVERY
GO
--This restore will have the error.
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestDiff.bak' WITH RECOVERY
GO

USE [DefunctTest2]
SELECT * FROM sys.database_files
GO

このバグの接続アイテムをここに送信しました。この無効なファイルを削除できる唯一の方法は、データベースをデタッチし、ATTACH_REBUILD_LOGを使用して再アタッチすることです。

更新:この再現スクリプトでこのシナリオを作成するバグは、このKB:https : //support.microsoft.com/en-us/kb/2830400で修正されたようです。コメントから、SQL2012 / 2014に追加の修正が利用可能であるように見えます。シナリオは非常に似ているようです:https ://support.microsoft.com/en-us/kb/3009576


人々が再現できるように、接続コメントにスクリプトを含めます。
ケネスフィッシャー

1
私は、SQL Server 2012のEnterprise Editionの、11.0.3412(SP1用CU9)上でスクリプトを実行しているすべてのエラーを得ることはありません

[詳細]ボタンをクリックした場合、再現スクリプトは[接続]項目にあります。
FilamentUnities 2014

1
Shawn、CUの修正を調べて、これはおそらくこの動作を修正したと思います:support.microsoft.com/kb/2830400
FilamentUnities '25

2
私は先週、これとの戦いをしました、そしてこのスレッドはそれを整理するのに役立ちますので、ありがとうございます。修正はSQL 2012 SP2 CU3にあるようです:support.microsoft.com/en-us/kb/3009576
Richard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.