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 関連の問題を検出し、「 Symptoms 」セクションで説明されているエラー メッセージのトラブルシューティングに役立ちます。
Symptomsセクションに記載されているエラー メッセージのいずれかが表示され、物理ドライブの障害などのイベントで説明されていない場合は、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 または READFile API が SQL Server を呼び出した明示的なエラーは表示されません。 代わりに、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:825853240) のログ レコード (276666:1664:19)、データベース 'authors' (7) ページ (1:1787100) を再実行できませんでした。 Page: LSN = (276658:4501:9)、type = 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
SQL Server sort
演算子は、通常、 tempdb
データベースで I/O アクティビティを実行します。 これらの 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 メッセージ テキストは、slotid (%d) が無効であるため、RID によってページ %S_PGIDから行を取得できません。
一部のお客様は、行数アクティビティを実行した後に不足している行を報告しています。 この問題は、書き込みが失われたために発生します。 おそらく、ページはクラスター化インデックス ページ チェーンにリンクされているはずです。 書き込みが物理的に失われた場合、データも失われます。
重要
いずれかの動作が発生した場合、またはキャッシュ メカニズムの無効化と同様の問題が疑われる場合は、SQL Server の最新の更新プログラムを入手することを強くお勧めします。 また、Microsoft では、オペレーティング システムとそれに関連する構成を厳密に確認することを強くお勧めします。
Microsoft では、まれで負荷の高い I/O 負荷の下で、一部のハードウェア プラットフォームで古い読み取りが返される可能性があることを確認しています。 拡張診断で古い読み取りまたは書き込みの状態が失われた可能性があることを示している場合は、ハードウェア ベンダーに連絡してすぐにフォローアップし、 SQLIOSim ユーティリティを使用してテストしてください。
SQL Server では、 SQL Server I/O 信頼性プログラムの要件に記載されているように、安定したメディアへの確実な配信をサポートするシステムが必要です。 SQL Server データベース エンジンの入力と出力の要件の詳細については、「Microsoft SQL Server データベース エンジン入力/出力の要件を参照してください。