現象
たとえば次のようなシナリオを考えてみます。
- Microsoft SQL Server 2014 には 2 つのパーティション テーブルがあり、最初のテーブルのパーティションは同じパーティション スキームと関数を使用して異なるファイルとファイル グループにマップされています。
- これらのパーティションの 1 つを 2 番目のテーブルに切り替えてから、2 番目のテーブルを切り捨てます。
- スイッチされたパーティションにマップされているファイルとファイル グループを削除します。
- 2 番目のテーブルで SELECT ステートメントを実行します。
このとき、次のエラー メッセージが表示されます。
注
メッセージ 606、レベル 21、状態 1
メタデータの不整合。 テーブル <テーブル名> に指定されたファイルグループ ID<ファイルグループ ID> が存在しません。 DBCC、CHECKDB、または CHECKCATALOG を実行します。
DBCC CHECKDB/CHECKTABLE を実行すると、次のエラー メッセージが表示されます。
注
ファイルグループ (FileGroup ID <FileGroupNumber>>) が無効なため、テーブル <TableName> のインデックス <IndexName を処理できません。
解決策
この問題は、SQL Server の次の累積的な更新プログラムで最初に修正されました。
推奨事項: SQL Server の最新の累積的な更新プログラムをインストールする
SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムをダウンロードしてインストールすることをお勧めします。
注: この修正プログラムは、この問題の将来の再発を防ぐだけです。 既にこの問題が発生している場合は、既存のメタデータを破損せずに、新しいデータベースにデータをエクスポートしてください。 手順は次のとおりです。
パーティションに無効なファイル グループがあるかどうかを確認するには、次のクエリを実行して結果が返されるかどうかを確認します。
SELECT * FROM sys.allocation_units AS au WHERE au.data_space_id NOT IN (SELECT data_space_id FROM sys.filegroups)メタデータが破損したテーブルを再び表示可能にします。
手順 1 のクエリが結果を返す場合、メタデータが破損しているパーティションが原因で、テーブル内の行を表示 (select * from) できません。 この問題を回避するには、その不正なパーティションを削除します。
注: 不良なパーティションは空である必要があります。 それ以外の場合、そのファイルとそのファイル グループを削除できなかった可能性があります。
これを行うには、このパーティションを、同じパーティション構成を使用する別のテーブルに移動します。 このテーブルは単なるダミー テーブルにすることができます。 手順 1 のクエリのcontainer_idを使用し、sys.partitions のpartition_idと照合します。 (partition_numberをメモしてください。)partition_numberを使用して、ダミー表に表示できなかったテーブルから ALTER TABLE SWITCH PARTITION を実行します。 ダミー テーブルは、同じ列セットを持ち、同じパーティション スキームを使用する必要があります。 矛盾したパーティションを見つけるためのクエリは、次のようになります。
SELECT au.container_id, au.data_space_id, p.partition_number FROM sys.partitions AS p JOIN sys.allocation_units AS au ON p.partition_id = au.container_id LEFT JOIN sys.filegroups AS fgs ON fgs.data_space_id = au.data_space_id WHERE object_id = OBJECT_ID('MyTableName') AND fgs.data_space_id IS NULL;以前は表示できなかったテーブルから新しいデータベースにデータをコピーします。
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。