SQL Server 診断は、古い読み取りまたは書き込みの損失による報告されていない I/O の問題を検出します

この記事では、SQL Server診断を使用して、古い読み取りまたは書き込みが失われたために発生する、レポートされていない入力または出力の問題を検出する方法について説明します。

元の製品バージョン: SQL Server
元の KB 番号: 826433

現象

オペレーティング システム、ドライバー、またはハードウェアの問題によって、I/O パスで書き込みまたは古い読み取り条件が失われると、SQL Serverでエラー 605、823、3448、3456 などのデータ整合性関連のエラー メッセージが表示されることがあります。 次の例のようなエラー メッセージが表示される場合があります。

2003-07-24 16:43:04.57 spid63 Getpage: bstat=0x9, sstat=0x800, cache
2003-07-24 16:43:04.57 spid63 pageno is/should be: objid is/should be:
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424
2003-07-24 16:43:04.57 spid63 ... IAM indicates that page is allocated to this object
2003-07-24 16:52:37.67 spid63 Error: 605, Severity: 21, State: 1
2003-07-24 16:52:37.67 spid63 Attempt to fetch logical page (1:7040966) in database 'pubs' belongs to object 'authors', not to object 'titles'..
2003-07-24 16:52:40.99 spid63 Error: 3448, Severity: 21, State: 1
2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). Page information: LSN = (63192:958360:10), type = 2. Log information: OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 Error: 823, Severity: 24, State: 2
2003-07-09 14:31:35.92 spid66 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'..
2010-02-06 15:57:24.14 spid17s Error: 3456, Severity: 21, State: 1.
2010-02-06 15:57:24.14 spid17s Could not redo log record (58997:5252:28), for transaction ID (0:109000187), on page (1:480946), database 'MyDatabase' (database ID 17). Page: LSN = (58997:5234:17), type = 3. Log: OpCode = 2, context 5, PrevPageLSN: (58997:5243:17). Restore from a backup of the database, or repair the database.

SQL Serverの新しい I/O 診断機能

SQL Serverでは、SQL Server 2000 Service Pack 4 以降の新しい I/O 診断機能が導入され、これらの診断はそれ以来製品の一部です。 これらの機能は、外部 I/O 関連の問題を検出し、「 現象 」セクションで説明されているエラー メッセージのトラブルシューティングに役立つよう設計されています。

[現象] セクションに記載されているエラー メッセージが表示され、物理ドライブの障害などのイベントで説明されていない場合は、SQL Server、オペレーティング システム、ドライバー、ハードウェアに関する既知の問題を確認してください。 診断は、次の 2 つの条件に関する情報を提供しようとします。

  • 失われた書き込み: WriteFile API の呼び出しが成功したが、オペレーティング システム、ドライバー、またはキャッシュ コントローラーは、書き込みが成功したことが通知SQL Server場合でも、データを物理メディアに正しくフラッシュしません。

  • 古い読み取り: ReadFile API の呼び出しが成功したが、オペレーティング システム、ドライバー、またはキャッシュ コントローラーが古いバージョンのデータを誤って返す。

説明するために、Microsoft は、WriteFile API 呼び出しが成功の状態を返すが、同じデータ ブロックの即時の正常な読み取りでは、ハードウェア読み取りキャッシュに格納されている可能性があるデータを含む古いデータを返すシナリオを確認しました。 場合によっては、読み取りキャッシュの問題が原因でこの問題が発生することがあります。 それ以外の場合、書き込みデータが物理ディスクに書き込まれることはありません。

診断を有効にする方法

SQL Server 2017 以降のバージョンでは、この診断機能は既定で有効になっています。 SQL Server 2016 以前のバージョンでは、これらの診断はトレース フラグ 818 を使用してのみ有効にすることができます。 トレース フラグ 818 は、SQL Server インスタンスのスタートアップ パラメーター -T818 として指定することも、次の T-SQL ステートメントを実行して実行時に有効にすることもできます。

DBCC TRACEON(818, -1)

トレース フラグ 818 では、並べ替えおよびワークファイル I/O を含めずに、SQL Serverを実行しているコンピューターによって実行された最後の 2,048 の正常な書き込み操作を追跡するために使用されるメモリ内リング バッファーが有効になります。 605、823、3448 などのエラーが発生すると、受信バッファーのログ シーケンス番号 (LSN) 値が最近の書き込みリストと比較されます。 読み取り操作中に取得された LSN が書き込み操作で使用された LSN より古い場合、新しいエラー メッセージがSQL Serverエラー ログに記録されます。 ほとんどのSQL Server書き込み操作は、チェックポイントまたは遅延書き込みとして実行されます (遅延書き込みは、非同期 I/O を使用するバックグラウンド タスクです)。 リング バッファーの実装は軽量であり、システムに対するパフォーマンスの影響はごくわずかです。

エラー ログ内のメッセージの詳細

次のメッセージには、writeFile API またはSQL Serverする ReadFile API 呼び出しからの明示的なエラーは表示されません。 代わりに、LSN がレビューされたときに発生した論理 I/O エラーが表示され、期待される値が正しくありませんでした。

SQL Server 2005 以降では、次のエラー メッセージが表示されます。

SQL Server論理整合性ベースの I/O エラー (古い読み取り) が検出されました。 これは、ファイル<FILE NAME>内のオフセット<PHYSICAL OFFSET>にあるデータベース ID <DBID> の ページ<PAGEID>の 中<Read/Write>に発生しました。 SQL Serverエラー ログまたはシステム イベント ログに追加のメッセージが表示される場合があります。 これは、データベースの整合性を脅かす重大なエラー状態であり、直ちに修正する必要があります。 データベースの完全な整合性チェック (DBCC CHECKDB) を完了します。 このエラーは、多くの要因によって発生する可能性があります。 詳細については、「オンライン ブックのSQL Server」を参照してください。

エラー 824 の詳細については、「 MSSQLSERVER_824」を参照してください。

このエラーが発生した時点または報告時に、読み取りキャッシュに古いバージョンのページが含まれているか、データが物理ディスクに正しく書き込まれませんでした。 どちらの場合も (書き込みの損失または古い読み取り)、オペレーティング システム、ドライバー、またはハードウェア レイヤーに関する外部の問題を報告SQL Server。

エラー 605 または 823 のトランザクションをロールバックしようとしたときにエラー 3448 が発生した場合、SQL Server インスタンスはデータベースを自動的に閉じ、データベースを開いて回復しようとします。 エラー 605 または 823 が発生する最初のページは無効なページと見なされ、ページ ID はSQL Serverを実行しているコンピューターによって保持されます。 回復中 (やり直しフェーズの前) に、無効なページ ID が読み取られた場合、ページ ヘッダーに関する主な詳細がSQL Serverエラー ログに記録されます。 このアクションは、失われた書き込みと古い読み取りのシナリオを区別するのに役立つので重要です。

古い読み取りと失われた書き込みで観察される動作

古い読み取りシナリオでは、次の 2 つの一般的な動作が表示される場合があります。

  • データベース ファイルが閉じられ、開かれた場合は、復旧中に正しい最後に書き込まれたデータが返されます。

  • チェックポイントを発行してステートメントを DBCC DROPCLEANBUFFERS 実行し (メモリからすべてのデータベース ページを削除する)、データベースでステートメントを DBCC CHECKDB 実行すると、最後に書き込まれたデータが返されます。

前の段落で説明した動作は、読み取りキャッシュの問題を示しており、読み取りキャッシュを無効にすることで頻繁に解決されます。 前の段落で説明したアクションは通常、キャッシュの無効化を強制し、発生した正常な読み取りは、物理メディアが正しく更新されていることを示しています。 失われた書き込み動作は、キャッシュ メカニズムが強制フラッシュされた後でも、読み戻されるページがまだ古いバージョンのデータである場合に発生します。

場合によっては、問題がハードウェア キャッシュに固有でない場合があります。 フィルター ドライバーに問題がある可能性があります。 このような場合は、バックアップ ユーティリティやウイルス対策ソフトウェアを含むソフトウェアを確認し、フィルター ドライバーに問題があるかどうかを確認します。

さまざまな古い読み取りと失われた書き込みのシナリオの説明

Microsoft では、エラー 605 または 823 の条件を満たしていないが、同じ古い読み取りまたは書き込みアクティビティが失われたことが原因である条件も示しています。 場合によっては、ページが同じ LSN 値で 2 回更新されるように見えます。 この動作は、オブジェクト ID とページ ID が正しく (既にオブジェクトに割り当てられているページ)、ページに変更が加えられた後、ディスクにフラッシュされた場合に発生する可能性があります。 次のページ取得では、古いイメージが返され、2 つ目の変更が行われます。 SQL Server トランザクション ログは、ページが同じ LSN 値で 2 回更新されたことを示しています。 このアクションは、トランザクション ログ シーケンスを復元しようとした場合や、外部キーのエラーやデータ エントリの欠落などのデータ整合性の問題が発生した場合に問題になります。 次のエラー メッセージは、この条件の 1 つの例を示しています。

エラー: 3456、重大度: 21、状態: 1 トランザクション ID (0:276666 825853240) のログ レコードをやり直しできませんでした (1:1787100)、データベース 'authors' (7)。 ページ: LSN = (276658:4501:9)、「= 1」と入力します。 ログ: OpCode = 4、コンテキスト 2、PrevPageLSN: (275565:3959:31)。。

一部のシナリオについては、次の一覧で詳しく説明します。

LSN SequenceAction
1   Checkpoint
2   Begin Transaction
3   Table created or truncated
4   Inserts (Pages allocated)
5   Newly allocated page written to disk by Lazy Writer
6   Select from table - Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
7   Rollback of transaction initiated
LSN SequenceAction
1   Checkpoint
2   Begin Transaction
3   Page Modification
4   Page written to disk by Lazy Writer
5   Page read in for another modification (stale image returned)
6   Page Modified for a second time but because of stale image does not see first modification 
7   Rollback - Fails - Transaction Log shows two different log records with the same PREV LSN for the page

sort SQL Server演算子は、一般的にデータベースで I/O アクティビティを実行しますtempdb。 これらの I/O 操作は、バッファー I/O 操作に似ています。ただし、既に読み取り再試行ロジックを使用して同様の問題を解決するように設計されています。 この記事で説明する追加の診断は、これらの I/O 操作には適用されません。

Microsoft は、次の並べ替えの読み取りエラーの根本原因は、一般に古い読み取りまたは書き込みの損失であることを示しています。

2003-04-01 20:13:31.38 spid122 SQL Server Assertion: File: <p:\sql\ntdbms\storeng\drs\include\record.inl>, line=1447 Failed Assertion = 'm_SizeRec > 0 && m_SizeRec <= MAXDATAROW'.
2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf. Retrying.
2003-03-29 09:51:41.13 spid57 Error: 823, Severity: 24, State: 7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x000000027d2000 in file 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'..
* 00931097 Module(sqlservr+00531097) (utassert_fail+000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow+000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)

古い読み取りまたは書き込みが失われると、予期しないデータ ストレージが発生するため、さまざまな動作が発生する可能性があります。 データが見つからないように見えるかもしれませんが、不足しているデータの一般的な影響の一部は、エラー 644 や 625 など、インデックスの破損として表示されます。

エラー 644 重大度レベル 21 メッセージ テキスト インデックス ページ %S_PGID、インデックス ID %d、データベース '%.*ls' で RID '%.*hs' のインデックス エントリが見つかりませんでした。

エラー 625 重大度レベル 21 メッセージ テキスト スロット ID (%d) が無効であるため、RID によってページ %S_PGIDから行を取得できません。

一部のお客様は、行数アクティビティを実行した後に不足している行を報告しています。 この問題は、書き込みが失われたために発生します。 おそらく、ページはクラスター化インデックス ページ チェーンにリンクされているはずです。 書き込みが物理的に失われた場合、データも失われます。

重要

いずれかの動作が発生した場合、またはキャッシュ メカニズムの無効化と同様の問題が疑われる場合は、SQL Serverの最新の更新プログラムを入手することを強くお勧めします。 また、Microsoft では、オペレーティング システムとそれに関連する構成を厳密に確認することを強くお勧めします。

Microsoft は、まれで負荷の高い I/O 負荷の下で、一部のハードウェア プラットフォームが古い読み取りを返すことができることを確認しました。 拡張診断が古い読み取りまたは書き込み失いの可能性があることを示している場合は、ハードウェア ベンダーに問い合わせて、すぐにフォローアップを行い、SQLIOSim ユーティリティを使用してテストしてください。

SQL Serverでは、SQL Server I/O 信頼性プログラム要件に記載されているように、安定したメディアへの確実な配信をサポートするシステムが必要です。 SQL Server データベース エンジンの入力要件と出力要件の詳細については、「Microsoft SQL Server データベース エンジン入力/出力要件」を参照してください。