Indeks magazynu kolumn w grupie plików tylko do odczytu zapobiega CheckDB

15

Wygląda na to, że ustawia grupę plików, aby read_onlyzapobiegać dbcc checkdbcałej bazie danych, jeśli grupa plików zawiera indeks magazynu kolumn. Podczas próby uruchomienia checkdblub checkfilegroup( dla dowolnej grupy plików w bazie danych, w tym plików pomocniczych do odczytu i zapisu oraz[PRIMARY] ), zwracany jest następujący błąd ...

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.

Czy istnieje obsługiwana metoda przechowywania danych w kolumnie w grupie plików tylko do odczytu? Czy w tym scenariuszu wykluczono mnie z kontroli integralności?

Repro

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

Uwaga: wysłano na fora technet

Peter Vandivier
źródło

Odpowiedzi:

12

Problem występuje, gdy DBCC próbuje zweryfikować usuniętą mapę bitową dla tabeli magazynu kolumn tylko do odczytu.

Usunięte mapy bitowe są przechowywane w tej samej grupie plików, co tabela magazynu kolumn. Śledzą wiersze logicznie usunięte ze skompresowanych grup wierszy.

O ile mi wiadomo, wszystko jest poprawnie zorganizowane w wewnętrznych tabelach systemowych (na SQL Server 2017 CU3), a większość kodu DBCC poprawnie uwzględnia ukryte zestawy wierszy, które przechowują usunięte mapy bitowe magazynu kolumn.

Z jakiegoś powodu sprawdzenie grup plików offline lub tylko do odczytu powoduje nieobsługiwany wyjątek:

Stos wywołań

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.

Ta sama kontrola w trybie offline / tylko do odczytu jest wykonywana kilka razy wcześniej w przetwarzaniu DBCC (podczas zbierania faktów) bez problemu.

Problem występuje, gdy jest uruchamiany DBCC CHECKDBlub DBCC FILEGROUP(na dowolnej grupie plików) lub DBCC CHECKTABLEjest proszony o sprawdzenie konkretnej tabeli magazynu kolumn tylko do odczytu. Żaden z nich nie powinien powodować błędu krytycznego, który uniemożliwia uruchomienie pozostałych kontroli DBCC, więc musi to być błąd.


Czy w tym scenariuszu wykluczono mnie z kontroli integralności?

Aby obejść DBCC CHECKFILEGROUPten problem , uruchom grupę plików magazynu kolumn bezpośrednio przed przekształceniem jej w tryb tylko do odczytu (lub uruchom DBCC CHECKDBw tym czasie), a następnie:

  1. DBCC CHECKALLOC w bazie danych
  2. Biegać DBCC CHECKCATALOG
  3. Uruchom DBCC CHECKTABLEdla każdej tabeli (z wyjątkiem tabel magazynu kolumn w grupie plików tylko do odczytu)
  4. Możesz także chcieć uruchomić DBCC CHECKCONSTRAINTS.

Zobacz Opcje sprawdzania spójności dla VLDB autorstwa Paula Randala i Q&A Dzielenie DBCC CHECKDB na wiele dni .

Paul White 9
źródło
9

Po pierwsze, dziękuję za informację i kod / sytuację odtwarzającą.

Wziąłem to i złożyłem wewnętrzny element, został przypisany i wkrótce zostanie sprawdzony.

Możesz głosować na pracę w grupie plików, aby read_only uniemożliwiał działanie komendy dbcc checkdb w witrynie z opiniami programu SQL Server.

Zaktualizuję tę odpowiedź, dodając więcej informacji, gdy tylko będzie dostępna.

Sean Gallardy
źródło