今日、msdbデータベースが疑わしいモードになっていることがわかったので、最新のバックアップからMSDBを復元しました(このデータベースの毎日のバックアップがあるため)。 Tsqlを使用してMSDBデータベースを復元すると、エラーが発生しましたが、データベースの復元は成功しました。
Processed 17056 pages for database 'msdb', file 'MSDBData' on file 1.
Processed 5 pages for database 'msdb', file 'MSDBLog' on file 1.
Msg 2627, Level 14, State 1, Line 2
Violation of PRIMARY KEY constraint 'PK__backupse__21F79AAB0E391C95'. Cannot insert duplicate key in object 'dbo.backupset'. The duplicate key value is (60979).
Msg 3009, Level 16, State 1, Line 2
Could not insert a backup or restore history/detail record in the msdb database. This may indicate a problem with the msdb database. The backup/restore operation was still successful.
The statement has been terminated.
RESTORE DATABASE successfully processed 17061 pages in 6.953 seconds (19.169 MB/sec).
しかし、復元後、SQLサーバーインスタンスが適切に実行され、すべてのデータベースにアクセスできることがわかりました。しかし、復元中に発生したエラーを確実にするために、MSDBデータベースに対してCHECKDB
コマンドを使用しました。以下のエラーが表示されます。
DBCC results for 'msdb'.
Msg 8921, Level 16, State 1, Line 1
Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors.
Msg 2515, Level 16, State 1, Line 1
The page (1:1044), object ID 60, index ID 1, partition ID 281474980642816, allocation unit ID 281474980642816 (type In-row data) has been modified, but is not marked as modified in the differential backup bitmap.
CHECKDB found 0 allocation errors and 1 consistency errors in table 'sys.sysobjvalues' (object ID 60).
CHECKDB found 0 allocation errors and 1 consistency errors in database 'msdb'.
では、これらのエラーは何ですか?また、復元中にエラーが発生したためですか?復元中にエラーが発生した場合、何かする必要がありますか?
PRIMARY KEY制約「PK__backupse__21F79AAB0E391C95」の違反。オブジェクト 'dbo.backupset'に重複するキーを挿入することはできません。重複するキーの値は(60979)です。
これは、誰かが_dbo.backupset
_を再シードした場合に発生する可能性があります。
テーブル定義から:
_PK__backupse*
_-> _clustered, unique, primary key located on PRIMARY
_-> _backup_set_id
_
そのエラーを修正するには:
_--- get the max backup set id from the backupset table
SELECT MAX(backup_set_id) + 1 FROM msdb.dbo.backupset
--- then reseed it
dbcc checkident('dbo.backupset', RESEED, VALUE_FROM_ABOVE)
_
次に、DBCC CHECKDB('msdb') WITH NO_INFOMSGS, ALL_ERRORMSGS
を実行して、すべてが正常に戻るかどうかを確認します。
メッセージ8921、レベル16、状態1、行1チェックが終了しました。ファクトの収集中に障害が検出されました。 tempdbの容量不足か、システムテーブルに一貫性がない可能性があります。以前のエラーを確認してください。
TABLOCKヒントを使用してDBCC CHECKDBを実行してみてください。tempdbが存在するドライブに十分なスペースがあり、tempdbの制限的な拡張(自動拡張がオフ)がないことを確認してください。
最後に、
メッセージ2515、レベル16、状態1、行1ページ(1:1044)、オブジェクトID 60、インデックスID 1、パーティションID 281474980642816、アロケーションユニットID 281474980642816(行内データタイプ)は変更されていますが、マークされていません差分バックアップビットマップで変更されたもの。 CHECKDBは、テーブル 'sys.sysobjvalues'(オブジェクトID 60)で0の割り当てエラーと1の一貫性エラーを検出しました。
DBCC CHECKDB('msdb') WITH TABLOCK, NO_INFOMSGS, ALL_ERRORMSGS
を実行してもエラーが発生する場合は、IOサブシステムに問題がある可能性があります。Windowsのイベントログを確認してください。
ページのチェックサムを有効にします。また、msdb(差分ビットマップをリセットします)の完全バックアップを取り、次にDBCC CHECKDB('msdb') WITH TABLOCK, NO_INFOMSGS, ALL_ERRORMSGS
を実行します
万が一の場合は、逆戻りして、復元する適切なバックアップを見つけてください。