Jakie rodzaje korupcji może przegapić DBCC CheckDB?

16

Pytanie to zostało podesłane przez ten wcześniejszy post, a moja baza danych została zarchiwizowana do przyszłego dochodzenia, która została przywrócona w następujący sposób:

BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.

W połączonym pytaniu i kopii zapasowej, którą przygotowałem do dochodzenia na stronie DBCC, DBCC CHECKDB przeszedł bezbłędnie, ale widocznie występuje uszkodzenie.

Jakiego rodzaju uszkodzenie może nastąpić, gdy CHECKDB przejdzie, ale kopia zapasowa z sumą kontrolną nie powiedzie się?

Mark Storey-Smith
źródło
1
Być może polecenie DBCC IND: udostępnia listę stron używanych przez tabelę lub indeks? Możesz spojrzeć na tabelę, indeks, gdzie jest problem.
garik
1
Zrobiłem szybką analizę stron, które zgłaszały błędy, gdy wystąpił problem. W 30-minutowym badaniu stwierdzono, że potrzebuję więcej niż 30 minut, aby dowiedzieć się, co było nie tak :) Kiedy wrócę do bardziej szczegółowego przyglądania się, opublikuję osobne pytanie ze szczegółami z tej sprawy.
Mark Storey-Smith

Odpowiedzi:

10

Poniżej znajduje się zestawienie wyników, na których czytałem. Znacznie więcej informacji znajdziesz w powiązanych blogach i dokumentach.

Po pierwsze, może się zdarzyć, że DBCC CHECKDBnie wykryje niespójności, jeśli wyłączysz sumę kontrolną lub weryfikację torn_page. Cytat Paula Randala w tym poście :

Masz rację - jeśli podarta strona lub suma kontrolna nie jest włączona, nie ma nic, co można wykryć, jeśli chodzi o opcje ochrony strony. CHECKDB może nadal wykrywać uszkodzenia, które wykryje po przeprowadzeniu wszystkich sprawdzeń spójności, które robi - ale na przykład nie zobaczy uszkodzeń w środku wartości danych.

Ha - to jest szaleństwo w włączaniu sum kontrolnych strony - nic się nie dzieje, dopóki strona nie zostanie wczytana, zmieniona i spisana ponownie. Jedynym sposobem zmuszenia stron do pobierania sum kontrolnych jest ich zmiana - np. Poprzez przebudowanie wszystkich indeksów, które mogą być niesmaczne - w ogóle nie ma narzędzia „dotykowego”.

Powyższa sytuacja może Cię dotknąć, jeśli zaktualizujesz bazę danych z SQL Server 2000 lub wcześniejszej wersji do 2005 lub późniejszej. Następnie musisz ręcznie włączyć sumy kontrolne strony za pomocą ALTER DATABASE, aby je uaktywnić. Ale wtedy pojawia się drugi akapit powyższego cytatu i może cię niepokoić.

BACKUP WITH CHECKSUMwykryje niespójności sumy kontrolnej, ale tylko wtedy, gdy strona ma już zapisaną sumę kontrolną, podczas tworzenia kopii zapasowej. Zwykle DBCC CHECKDBwykrywa również te błędy, więc nie jest dobrym pomysłem stosowanie funkcji BACKUP WITH CHECKSUM w celu zastąpienia DBCC CHECKDB .

Teraz jest druga możliwość, aby DBCC CHECKDBnie pokazywać żadnych niespójności, nawet jeśli istnieją. W tym celu ponownie cytuję Paula Randala w nieporozumieniach dotyczących zepsucia: czy mogą zniknąć? :

A co z znikającymi zepsuciami? Od tego zależy sposób sprawdzania spójności. Sprawdzanie spójności działa tylko na przydzielonych stronach bazy danych. Jeśli strona nie jest do niczego przypisana, to 8192 bajtów jest bez znaczenia i nie można jej interpretować. Nie daj się pomylić między zarezerwowanym a przydzielonym - wyjaśniam, że w pierwszych nieporozumieniach pisz tutaj. Dopóki strona jest przydzielana, będzie sprawdzana spójność przez DBCC CHECKDB, w tym testowanie sumy kontrolnej strony, jeśli istnieje. Uszkodzenie może wydawać się „znikać”, jeśli uszkodzona strona zostanie przydzielona w czasie działania DBCC CHECKDB, ale następnie zostanie cofnięta przy następnym uruchomieniu DBCC CHECKDB. Za pierwszym razem zostanie zgłoszony jako uszkodzony, ale za drugim razem nie zostanie przydzielony, więc nie jest sprawdzana spójność i nie zostanie zgłoszony jako uszkodzony. Zepsucie wygląda, jakby tajemniczo zniknęło. Ale tak się nie stało - po prostu uszkodzona strona nie jest już przydzielana. Nic nie stoi na przeszkodzie, aby SQL Server zwalniał uszkodzoną stronę - w rzeczywistości to właśnie robi wiele napraw DBCC CHECKDB - zwalnia to, co jest zepsute, i naprawia wszystkie linki.

Nie mam ostatecznej odpowiedzi na twoje pytanie, ale ponieważ DBCC CHECKDBsprawdza tylko przydzielone strony, nie będzie wykazywał niespójności na zwolnionych stronach. Jedyną sytuacją, jaką mogę sobie teraz wyobrazić, jest to, że BACKUP tworzy kopie zapasowe również tych zwolnionych stron, pokazując potencjalne błędy sum kontrolnych, które zostały pominięte DBCC CHECKDB.

MicSim
źródło
Większość artykułów Paula ma już zakładki, ale +1 za podsumowanie. Żadne z nich nie dotyczy bazy danych, którą odłożyłem na bok, mając nadzieję, że inni mogą dodać dalsze przemyślenia.
Mark Storey-Smith