Dzielenie DBCC CHECKDB przez wiele dni

10

Pracuję nad wdrożeniem przez Paula Randala metody ręcznego rozkładania DBCC CHECKDB na kilka dni w przypadku bardzo dużych baz danych, które zasadniczo obejmują:

  • Dzielenie tabel w bazie danych z grubsza jednakowo pomiędzy 7 segmentów
  • Uruchamianie DBCC CHECKALLOC dwa razy w tygodniu
  • Uruchamianie DBCC CHECKCATALOG raz w tygodniu
  • Uruchamianie tabeli kontrolnej DBCC na jednym wiadrze każdego dnia tygodnia

Czy ktoś użył tej techniki? Jakieś istniejące skrypty?

Obawiam się, że to może nie obejmować wszystkiego, co robi CHECKDB; dokumentacja Books Online dla CHECKDB mówi, że oprócz CHECKALLOC, CHECKCATALOG i CHECKTABLE, to także:

  • Sprawdza zawartość każdego indeksowanego widoku w bazie danych.
  • Sprawdza spójność na poziomie łącza między metadanymi tabeli a katalogami i plikami systemu plików podczas przechowywania danych varbinary (max) w systemie plików za pomocą FILESTREAM. (Tylko SQL 2008)
  • Sprawdza poprawność danych Service Broker w bazie danych.

Oto moje pytania:

  1. Czy te dodatkowe kontrole są konieczne / ważne? (Widoki indeksowane są dla mnie trochę bardziej niepokojące, nie sądzę, że korzystamy z Service Brokera lub FILESTREAM.)

  2. Jeśli tak, czy istnieją sposoby na przeprowadzenie tych dodatkowych kontroli osobno?

  3. CHECKALLOC i CHECKCATALOG wydają się działać bardzo szybko, nawet na dużych dbs. Czy jest jakiś powód, aby nie uruchamiać ich codziennie?

(Uwaga: będzie to standardowa procedura dla tysięcy istniejących baz danych na setkach serwerów lub przynajmniej każdej bazy danych o określonym rozmiarze. Oznacza to, że opcje takie jak restrukturyzacja wszystkich baz danych w celu użycia CHECKFILEGROUP nie są dla nas praktyczne).

BradC
źródło
Paul odpowiedział na wersję tego pytania w komentarzach na swoim blogu. Powiedział: „Nie martw się o sprawdzanie poprawności widoku indeksowanego. Jest ono domyślnie wyłączone od 2008 r., Ponieważ nie znajdowało problemów”.
BradC,
Pracuję, aby zrobić to samo - jakieś porady, które znalazłeś, ponieważ prawdopodobnie już to zaimplementowałeś?
scsimon
1
@scsimon Mam to działa dobrze, zobacz to powiązane pytanie dla konkretnej strategii, której użyłem do podzielenia tabel. Myślę, że ostatecznie stworzyłem główną listę wszystkich tabel we wszystkich (dużych) bazach danych na całym serwerze, aby podzielić je na codzienne „segmenty”, co dało mi znacznie bardziej równomierny podział niż podzielenie listy każdej bazy danych osobno. Mniejsze bazy danych Po prostu robiłem pełne DBCC każdego dnia i nie brałem udziału w podziale.
BradC,

Odpowiedzi:

6

Czy te dodatkowe kontrole są konieczne / ważne? (Widoki indeksowane są dla mnie trochę bardziej niepokojące, nie sądzę, że korzystamy z Service Brokera lub FILESTREAM.)

Możesz uruchomić DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS bezpośrednio w indeksowanych widokach . Sprawdzanie indeksowanych widoków może być problematyczne w pewnych okolicznościach , więc przygotuj się na zbadanie wszelkich wyników fałszywie dodatnich. (Paul Randal wspomina również w komentarzach do przywołanego artykułu, że możliwe są również fałszywe negatywy, ale nie mam bezpośredniego doświadczenia).

Jeśli tak, czy istnieją sposoby na przeprowadzenie tych dodatkowych kontroli osobno?

Nie ma obsługi uruchamiania Service Brokera ani FILESTREAMczeków osobno, nie.

CHECKALLOCi CHECKCATALOGwydają się działać bardzo szybko, nawet na dużych dbs. Czy jest jakiś powód, aby nie uruchamiać ich codziennie?

Nie, że jestem tego świadomy.


Możesz także rozważyć uruchomienie DBCC CHECKCONSTRAINTS. Kontrola ta jest nie wliczone w DBCC CHECKDB, niezależnie od opcji można określić. Możesz także pomyśleć o okazjonalnym bieganiu CHECKDB, gdy okoliczności na to pozwalają.

Paul White 9
źródło
6

DBCC CHECKDB jest niezbędny, aby bazy danych SQL Server były w 100% pewne, że nie ma uszkodzeń. Jednak ze względu na ogromne rozmiary baz danych bardzo trudno jest znaleźć okno konserwacji, gdy twierdzisz, że masz 24x7. Przez lata zespół SQL Server wdrożył różne mechanizmy wykrywające najczęstsze formy zepsucia, szczególnie związane z fizycznym uszkodzeniem spowodowanym przez sprzęt.

SQL Server 2005 i nowsze wersje mają parametr PAGE_VERIFY = CHECKSUM, który może pomóc proaktywnie wykryć fizyczne uszkodzenie stron bazy danych, dodając w ten sposób sumę kontrolną do każdej strony zapisywanej w systemie we / wy i sprawdzając sumę kontrolną podczas odczytu z dysku.

Ponadto tworzenie kopii zapasowych (pełne lub różnicowe) za pomocą CHECKSUM gwarantuje wykrycie wszelkich uszkodzeń we / wy spowodowanych przez sprzęt.

Dlatego od strony sprzętowej uszkodzenia SQL Server dobrze wykrywa go i zgłasza. (Pamiętaj również o ustawieniu ważnych alertów związanych z korupcją ).

To powiedziawszy, nadal logiczne uszkodzenie , błędy wywoływane przez skrybera - w których strony w pamięci są uszkodzone albo przez kod innej firmy działający w procesie SQL Server, albo przez sterowniki lub inne oprogramowanie z wystarczającymi uprawnieniami do wykonywania w trybie jądra systemu Windows i / lub SQL Server Błędy itp. Są niewykrywalne przy użyciu powyższych metod i dlatego pojawia się CHECKDB .

DBCC CHECKDB wykonuje dokładniejsze kontrole, które obejmują sprawdzanie nagłówków stron pod kątem ewentualnych uszkodzeń, których nie można wykryć w żaden inny sposób.

Jakieś istniejące skrypty?

Zamiast na nowo wymyślić koło, zdecydowanie polecam przyjrzeć się rozwiązaniu Ola SQL Server Integrity Check

Sprawnie działające DBCC CHECKDB:

Musisz być kreatywny, gdy jesteś blisko okna konserwacji, mając ogromne bazy danych lub dużą liczbę baz danych, na których można uruchomić CHECKDB.

Po przejściu szkolenia SQLSkills zaimplementowałem w moim środowisku:

  • ustal, jakie tabele mają krytyczne znaczenie do sprawdzenia.
  • podziel tabele na grupy o różnych priorytetach, a następnie uruchom je DBCC CHECKTABLEwraz z uruchomieniem DBCC CHECKALLOCiDBCC CHECKCATALOG
  • Utwórz tabelę roboczą, która będzie przechowywać nazwy tabel z priorytetami. Upewnij się tylko, że wszystkie tabele o wysokim priorytecie (które są ogromne) nie znajdują się w jednej grupie, w przeciwnym razie Twój CHECKDB w ogóle się nie ukończy.
  • Możesz nawet mieć kolumnę limitu czasu w tabeli roboczej, która będzie koordynować, kiedy Twój CHECKDB zostanie zabity po przejściu przez okno konserwacji
  • Dodaj jak długo zajęło na stole do biegu DBCC CHECKTABLE, DBCC CHECKALLOCa DBCC CHECKCATALOG. Tak, że można poczuć się, jak długo jest ona zwykle biorąc dla kontroli do uruchomienia.
  • Możesz nawet uruchomić z NOINDEXopcją, ponieważ przyspieszy to operację, ponieważ nie sprawdza indeksów nieklastrowanych w tabelach użytkowników. Ma to pewną zaletę, ponieważ nie jest tak krytyczne jak uszkodzenie danych, ponieważ żadne dane nie są tracone, w razie potrzeby można upuścić i ponownie utworzyć indeks.

Oczywiście wersja Enterprise może korzystać z równoległego wykonywania instrukcji DBCC, ale uważaj na ustawienie MAXDOP, ponieważ może to zająć cały procesor. Może to być mocno ograniczone przez Resource Governor.

Uwaga: jeśli masz kolumnę SPARSE, wtedy Twój CHECKDB będzie bardzo powolny, jak opisano tutaj .

Wreszcie, jak zapobiegać uszkodzeniu bazy danych, wykorzystując cały dostępny zestaw narzędzi + swoją wiarę w system sprzętowy serwera bazy danych i, co najważniejsze, wartość twoich danych.

Kilka doskonałych referencji:

Kin Shah
źródło