DBCC UPDATEUSAGE による CHECKDB エラーの修正

SQL Server 2008 R2 Standard Edition の環境でメンテナンス プランによる毎日 フルバックアップをスケジュールしていたところ、あるタイミングからバックアップが失敗するようになってしまいました。

メンテナンス プランによるバックアップは、大まかに以下の流れで実施しています。

  1. データベースの整合性確認タスク (CHECKDB)
  2. T-SQL ステートメントの実行タスク (フル バックアップ)
  3. その他の処理 (クリーンアップなど)

フル バックアップを実施するところで、データベースのバックアップ タスクを利用せず、T-SQL のタスクを利用している理由は条件分岐などをいろいろ仕込みたかったからです。

では、まずメンテナンス プランの履歴を表示して確認してみます。UpdateUsage_01エラー メッセージには以下のように説明がありました。

メッセージ内に記載されたテーブルにある ID 1 のインデックスに不適切なデータがあるので、DBCC UPDATEUSAGE を実行して直すと良い、とのことです。

ちょっとだけ DBCC UPDATEUSAGE を調べてみます。

DBCC UPDATEUSAGE (Transact-SQL)

以下のような記述があります。

sp_spaceused を実行すると間違ったレポートを返してくれるらしいので、実行してみました。sp_spaceused は対象のデータベース上で実行しますので、必要に応じて USE <データベース名> を実行してから sp_spaceused を実行します。

EXEC sp_spaceused N'<テーブル名>’;

reserved のところが、なぜか 負の値 になってますね。確かにおかしくなっています。UpdateUsage_02そこで、エラー メッセージで指示された通りに DBCC UPDATEUSAGE を実行してみます。DBCC UPDATEUSAGE はデータベース単位でも実行できますが、今回はテーブル名も特定できているので、テーブルを対象に実行してみます。

DBCC UPDATEUSAGE (<データベース名>, <テーブル名>);

以下のようなメッセージが表示されました。

UpdateUsage_03メッセージによるとデータが修正できたみたいです。再度 sp_spaceused してみたら、確かに reserved が負の値ではなくなっています。UpdateUsage_04この後、メンテナンス プランの実行状況を見てみると、バックアップ (の前の CHECKDB) が正常に実行されていました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です