最近、テストサーバー上のいくつかのデータベースを運用環境から更新するように依頼されました。常にベストプラクティスに従いたいので、WITH CHECKSUMオプションを使用してバックアップを実行したところ、最終的に次のエラーが発生しました。
Msg 3043, Level 16, State 1, Line 32
BACKUP 'DBName' detected an error on page (1:428321) in file 'F:\path\DBName.mdf'.
Msg 3013, Level 16, State 1, Line 32
BACKUP DATABASE is terminating abnormally.
エラーに驚いた私はDBCC CHECKDBを実行して何が起こっているのかを確認しましたが、残念ながら(おそらく幸いにも)正常に戻りました。
これまでに見つけたすべての情報は、DBCC CHECKDBの調査結果を次に進むためのガイドとして使用することを奨励しているので、これを修正する方法がわかりません。
いくつかの簡単な情報:
SQL Serverは2008 R2です。
msdb.dbo.suspect_pagesテーブルでエラーの確認を見つけました。イベントタイプ1および3が含まれます。
私が使用したDBCCコマンドは、DBCC CHECKDB(DBName)WITH NO_INFOMSGS、ALL_ERRORMSGSでした。
私は公式のDBAではありませんが、ある程度の経験があるため、バックアップと復元を行うことが許可されました。
私は同様の投稿を読みました DBCC CheckDBが見逃す可能性のある破損の種類は何ですか? 。しかし、私はなぜ(その投稿のポイント)を理解していると信じていますが、それを解決する方法がわかりません。
WITH CHECKSUMオプションを省略して、バックアップを正常に実行できました。
ガイダンスを事前にありがとう!
以下の「usr」から提供されたコメントは、私を正しい軌道に乗せました。ページ(1:428321)には正確に何が含まれていますか?さらに調査したところ、DBCC PAGEコマンドが見つかりました。しかし、何か変なことに気づきました。次を実行すると...
DBCC TRACEON (3604);
DBCC PAGE ('DBName', 1, 428321, 3);
私は以下を受け取りました(最初の行のページ番号に注意してください)...
PAGE: (1:2021305)
BUFFER:
BUF @0x0000000CFEFCC580
bpage = 0x0000000CFE764000 bhash = 0x0000000000000000 bpageno = (1:428321)
bdbid = 18 breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 20204 bstat = 0xc00809
blog = 0xbcca2159 bnext = 0x0000000000000000
PAGE HEADER:
Page @0x0000000CFE764000
m_pageId = (1:2021305) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 5313 m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594386120704 Metadata: PartitionId = 0
Metadata: IndexId = -1 Metadata: ObjectId = 0 m_prevPage = (1:2021304)
m_nextPage = (1:2021306) pminlen = 194 m_slotCnt = 10
m_freeCnt = 228 m_freeData = 7944 m_reservedCnt = 0
m_lsn = (121329:238172:13) m_xactReserved = 0 m_xdesId = (0:0)
m_ghostRecCnt = 0 m_tornBits = 297819981
Allocation Status
GAM (1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED
PFS (1:420576) = 0x40 ALLOCATED 0_PCT_FULL DIFF (1:6) = CHANGED
ML (1:7) = NOT MIN_LOGGED
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
ページ2021305???私は428321を入力しませんでしたか?その前のページ(428320)でコマンドを実行すると、そのページが表示されます。近づいていると思いますが、そのページに何が含まれているかはまだわかりません。
これを修正する方法がわかりません
コメントで調査しましたが、ページが割り当てられているかどうかは最終的にわかりませんでした。
割り当てられている場合、これは間違いなくCHECKDB
が見逃した破損です。 CHECKDB
のバグ。マイクロソフトに報告してください。
割り当てられていない場合は、次の方法で修正します。ファイルにダミーデータを入力します。 CONVERT(binary(8000), 0x)
。これで、ページはダミーデータによって消費され、クリーンなもので上書きされているはずです。
実際、このアイデアはtestに使用でき、SQL Serverがページが割り当てられていると見なすかどうかを示します。これが機能する場合は、確実に割り当てられません。
または、ページ書き込み機能を使用してページをゼロで埋めることができますが、データベースブートページに監査トレースが残ります。マイクロソフトのサポートはこれを見つけるのが嫌いだと思う。彼らはあなたのページの書き込みが損傷を引き起こしたと思うかもしれません。また、解決せずに終了することにより、この調査からすべての楽しみを盗みます:)