SQL Server 2008 R2 Standard Edition の環境でメンテナンス プランによる毎日 フルバックアップをスケジュールしていたところ、あるタイミングからバックアップが失敗するようになってしまいました。
メンテナンス プランによるバックアップは、大まかに以下の流れで実施しています。
- データベースの整合性確認タスク (CHECKDB)
- T-SQL ステートメントの実行タスク (フル バックアップ)
- その他の処理 (クリーンアップなど)
フル バックアップを実施するところで、データベースのバックアップ タスクを利用せず、T-SQL のタスクを利用している理由は条件分岐などをいろいろ仕込みたかったからです。
では、まずメンテナンス プランの履歴を表示して確認してみます。エラー メッセージには以下のように説明がありました。
1 2 3 |
クエリ "DBCC CHECKDB(N'<データベース名>') WITH NO_INFOMSGS" の実行が次のエラーで失敗しました: "オブジェクト "<テーブル名>"、インデックス ID 1、パーティション ID 281847166664704、アロケーション ユニット ID 281847166664704 (型 In-row data) の In-row data RSVD page カウントが不適切です。DBCC UPDATEUSAGE を実行してください。 CHECKDB により、テーブル '<テーブル名>' (オブジェクト ID 5679168) に 0 個のアロケーション エラーと 1 個の一貫性エラーが見つかりました。 CHECKDB により、データベース '<データベース名>' に 0 個のアロケーション エラーと 1 個の一貫性エラーが見つかりました。"。考えられるエラーの理由: クエリに問題がある、"ResultSet" プロパティが正しく設定されていない、パラメーターが正しく設定されていない、または接続が正しく確立されていない。 |
メッセージ内に記載されたテーブルにある ID 1 のインデックスに不適切なデータがあるので、DBCC UPDATEUSAGE を実行して直すと良い、とのことです。
ちょっとだけ DBCC UPDATEUSAGE を調べてみます。
DBCC UPDATEUSAGE (Transact-SQL)
以下のような記述があります。
1 |
カタログ ビューのページと行数の情報に不一致がある場合、それらをレポートおよび修正します。情報に不一致があると、sp_spaceused システム ストアド プロシージャによって間違った領域使用状況レポートが返される原因となります。 |
sp_spaceused を実行すると間違ったレポートを返してくれるらしいので、実行してみました。sp_spaceused は対象のデータベース上で実行しますので、必要に応じて USE <データベース名> を実行してから sp_spaceused を実行します。
EXEC sp_spaceused N'<テーブル名>’;
reserved のところが、なぜか 負の値 になってますね。確かにおかしくなっています。そこで、エラー メッセージで指示された通りに DBCC UPDATEUSAGE を実行してみます。DBCC UPDATEUSAGE はデータベース単位でも実行できますが、今回はテーブル名も特定できているので、テーブルを対象に実行してみます。
DBCC UPDATEUSAGE (<データベース名>, <テーブル名>);
以下のようなメッセージが表示されました。
1 2 3 |
DBCC UPDATEUSAGE: テーブル '<テーブル名>' (インデックス '<インデックス名>'、パーティション 1) の使用状況カウントが更新されました。 RSVD ページ (In-row Data): (-1) ページから (0) ページに変更されました。 DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。 |
メッセージによるとデータが修正できたみたいです。再度 sp_spaceused してみたら、確かに reserved が負の値ではなくなっています。
この後、メンテナンス プランの実行状況を見てみると、バックアップ (の前の CHECKDB) が正常に実行されていました。