エラー5180が発生?
案件の概要
お客様からエラー5180が発生したとの連絡を受けました。このエラーは、参照しようとしたFCB(ファイルコントロールブロック)のファイルIDが不正だったことを示しています。
SQL Serverは、データベースファイルに関連する情報をFCBという内部構造体で管理しています。管理している情報には、ファイルハンドルなどがあります。ファイルひとつにつき、ひとつ存在します。
エラーメッセージは、具体的には次のようなものでした。
エラー: 5180、重大度: 22、状態: 1。 Could not open File Control Bank (FCB) for invalid file ID 0 in database 'tempdb'. Verify the file location. Execute DBCC CHECKDB.
これは、何らかの処理でファイル操作が必要になり、FCBを参照しようとしたけれどもfile ID 0に紐づくFCBが存在していなかった、というエラーです。File IDの最小値は1なので、FCBを取得しようとしている処理が、誤ったfile IDをキーにしてFCBを取得しようとするとFCBを管理している側のコードにあるバリデーションに引っかかり、このエラーが発生するのです。
エラーの状況を確認する為、その場でサーバーを少しのぞかせてもらいました。しかし、SQL Serverのエラーログには前述のエラーメッセージ以上の内容は出力されておらず、リングバッファを確認しても既にログが循環していたのか、5180エラーに関するレコードが残っていなくて、何が起きていたのかわかりませんでした。
以下のKBにもありますが、誤ったfile IDが使われてしまう例として、ファイルが破損してしまっているという可能性があります。例えば、ヒープページにあるforwarded recordは、実際のレコードの代わりにforward先のページIDを持っていることがありますが、この部分が壊れて0になってしまっていると、forward先のファイルを読み込もうとした時にfile IDが0の為このエラーが発生します。
How to troubleshoot Msg 5180 in SQL Server
http://support.microsoft.com/kb/2015747
ただ、ファイルが破損しているような場合、ほかにも破損を示すようなエラーが出力されてもおかしくありません。今回の場合、5180エラー以外に破損を示すようなエラーが発生していないこと、対象のデータベースがtempdbであることから、SQL Serverの不具合である可能性が高いと考えました。