web-dev-qa-db-ja.com

read_onlyファイルグループの列ストアインデックスがCheckDBを妨げています

ファイルグループにread_onlyを設定すると、ファイルグループに列ストアインデックスが含まれている場合、データベース全体でdbcc checkdbが使用できなくなります。データベースのcheckdbまたはcheckfilegroupforanyファイルグループを実行しようとすると、読み取り/書き込みセカンダリと[PRIMARY])を含め、以下のエラーが返されます...

Msg 8921, Level 16, State 1, Line 24
Check terminated. A failure was detected while collecting facts. 
Possibly tempdb out of space or a system table is inconsistent. Check previous errors.

列ストアデータを読み取り専用ファイルグループに含めるためにサポートされている方法はありますか?それとも、このシナリオでは整合性チェックから除外されていますか?

再現

create database check_fg_ro
go
use check_fg_ro
go
exec sp_changedbowner 'sa';
go
alter database check_fg_ro add filegroup check_fg_ro_2;
alter database check_fg_ro
    add file (
         name='check_fg_ro_2'
        ,filename='C:\check_fg_ro_2.ndf'
    ) to filegroup check_fg_ro_2;
go
create table foo ( 
    i int not null primary key
) on check_fg_ro_2;
go
create columnstore index ccix_foo on foo(i);
go
use master
go
alter database check_fg_ro modify filegroup check_fg_ro_2 read_only;
go
dbcc checkdb( check_fg_ro ) with no_infomsgs, all_errormsgs, extended_logical_checks;
/*
Msg 8921, Level 16, State 1, Line 24
Check terminated. A failure was detected while collecting facts. 
Possibly tempdb out of space or a system table is inconsistent. Check previous errors.
*/
go

免責事項: technet forums にクロスポスト

15
Peter Vandivier

この問題は、DBCCが読み取り専用の列ストアテーブルの削除されたビットマップを確認しようとしたときに発生します。

削除されたビットマップは、列ストアテーブルと同じファイルグループに保存されます。圧縮された行グループから論理的に削除された行を追跡します。

私の知る限り、すべては内部システムテーブル(SQL Server 2017 CU3上)で正しく整理されており、ほとんどのDBCCコードは、列ストアの削除されたビットマップを保持する非表示の行セットを正しく説明しています。

何らかの理由で、オフラインまたは読み取り専用のファイルグループをチェックすると、未処理の例外が発生します。

Call stack

Msg 8921, Level 16, State 1, Line 69
Check terminated. A failure was detected while collecting facts.
Possibly tempdb out of space or a system table is inconsistent.
Check previous errors.

同じオフライン/読み取り専用チェックが、DBCC処理(ファクトが収集されているとき)の数回前に問題なく実行されます。

問題はDBCC CHECKDBまたはDBCC FILEGROUPが(任意のファイルグループで)実行される、またはDBCC CHECKTABLEは、特定の読み取り専用列ストアテーブルを確認するよう求められます。これらのどれも致命的なエラー状態を生成して、残りのDBCCチェックの実行を妨げることはないので、これはバグであるに違いありません。


それとも、このシナリオでは整合性チェックから除外されていますか?

回避策として、 DBCC CHECKFILEGROUP 読み取り専用にされる(またはDBCC CHECKDBそのとき)、次に:

  1. DBCC CHECKALLOC データベース
  2. 実行 DBCC CHECKCATALOG
  3. 実行 DBCC CHECKTABLE 各テーブル(読み取り専用ファイルグループの列ストアテーブルを除く)
  4. DBCC CHECKCONSTRAINTS

VLDBの整合性チェックオプション Paul RandalおよびQ&Aによる DBCC CHECKDBの複数日にわたる分割 を参照してください。

12
Paul White 9

まず、情報と再現コード/状況をありがとうございます。

私はこれを取得して内部アイテムを提出しました。割り当てられており、まもなく確認されます。

SQL Serverフィードバックサイトの filegroup to read_only prevent dbcc checkdb from running で作業に投票できます。

入手可能になり次第、この回答を更新して詳細をお知らせします。

9
Sean Gallardy