web-dev-qa-db-ja.com

DBCC CHECKDBではなく、BACKUP WITH CHECKSUMによって検出された破損を解決する方法

最近、テストサーバー上のいくつかのデータベースを運用環境から更新するように依頼されました。常にベストプラクティスに従いたいので、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の調査結果を次に進むためのガイドとして使用することを奨励しているので、これを修正する方法がわかりません。

いくつかの簡単な情報:

  1. SQL Serverは2008 R2です。

  2. msdb.dbo.suspect_pagesテーブルでエラーの確認を見つけました。イベントタイプ1および3が含まれます。

  3. 私が使用したDBCCコマンドは、DBCC CHECKDB(DBName)WITH NO_INFOMSGS、ALL_ERRORMSGSでした。

  4. 私は公式のDBAではありませんが、ある程度の経験があるため、バックアップと復元を行うことが許可されました。

  5. 私は同様の投稿を読みました DBCC CheckDBが見逃す可能性のある破損の種類は何ですか? 。しかし、私はなぜ(その投稿のポイント)を理解していると信じていますが、それを解決する方法がわかりません。

  6. 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)でコマンドを実行すると、そのページが表示されます。近づいていると思いますが、そのページに何が含まれているかはまだわかりません。

5
Hercule Poirot

これを修正する方法がわかりません

コメントで調査しましたが、ページが割り当てられているかどうかは最終的にわかりませんでした。

割り当てられている場合、これは間違いなくCHECKDBが見逃した破損です。 CHECKDBのバグ。マイクロソフトに報告してください。

割り当てられていない場合は、次の方法で修正します。ファイルにダミーデータを入力します。 CONVERT(binary(8000), 0x)。これで、ページはダミーデータによって消費され、クリーンなもので上書きされているはずです。

実際、このアイデアはtestに使用でき、SQL Serverがページが割り当てられていると見なすかどうかを示します。これが機能する場合は、確実に割り当てられません。

または、ページ書き込み機能を使用してページをゼロで埋めることができますが、データベースブートページに監査トレースが残ります。マイクロソフトのサポートはこれを見つけるのが嫌いだと思う。彼らはあなたのページの書き込みが損傷を引き起こしたと思うかもしれません。また、解決せずに終了することにより、この調査からすべての楽しみを盗みます:)

2
usr