Konieczne jest obejście programu SQL Server Frozen Ghost Cleanup

15

Mam kilka tabel z ilością rzędów od 5M do 1,5G

Każda tabela ma swoje pole BLOB, którego rozmiar waha się od 100 bajtów do 30 MB i które są przechowywane jako „duże typy wartości poza wierszem” = ON

Tabele są przechowywane w różnych aplikacjach z 3-4 plikami na różnych dyskach @ różnych jednostkach LUN @ bardzo szybkiej sieci SAN

Każdego dnia te tabele rosną do wielkości 5-100 Gb i przy rzędach 600k - 1,5M

Po pewnym czasie , który wynosi od 2 tygodni do 6 miesięcy, niektóre wiersze są usuwane lub przenoszone do archiwizacji DB, więc - nie ma żadnych wierszy w tabelach roboczych starszych niż 6 miesięcy.

Aktualna konfiguracja serwera:

  • Mechanizm serwera SQL to 2008 R2 SP1 Enterprise @ 24 rdzenie, @ 64 GB pamięci RAM
  • SQL Server działa z dodatkowymi flagami startowymi:

-T 3640; (Eliminuje wysyłanie do klienta komunikatów DONE_IN_PROC dla każdej instrukcji w procedurze składowanej. Jest to podobne do ustawienia sesji USTAW NOCOUNT WŁĄCZONY, ale po ustawieniu flagi śledzenia każda sesja klienta jest obsługiwana w ten sposób)

-T 1118; (Przełącza przydziały w tempDB z 1pg na raz (dla pierwszych 8 stron) w jednym zakresie.)

-T 2301; (Umożliwia zaawansowane optymalizacje, które są specyficzne dla zapytań wspomagających podejmowanie decyzji. Ta opcja dotyczy przetwarzania wspomagającego podejmowanie decyzji dla dużych zestawów danych)

-T 1117; (Zwiększa wszystkie pliki danych naraz, w przeciwnym razie idzie po kolei).

-MI; (Zwiększa liczbę zakresów przydzielonych dla każdego pliku w grupie plików. Ta opcja może być pomocna w przypadku aplikacji hurtowni danych, które mają ograniczoną liczbę użytkowników skanujących indeks lub dane)

-T 834; (Powoduje, że SQL Server używa alokacji dużych stron systemu Windows dla pamięci przydzielonej dla puli buforów, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )

  • SQL Server używa rozszerzeń dużych stron
  • SQL Server wykorzystuje opcję szybkiej inicjalizacji plików
  • AUTOSHRINK jest WYŁĄCZONY dla wszystkich baz danych

Problem polega na tym, że począwszy od pewnego czasu przestoju serwera (od kilku dni do miesięcy) GHOST CLEANUPproces odmawia wykonania wymuszonych porządków i po prostu wykonuje swoją zwykłą pracę - czyści kilka stron w ciągu kilku sekund ( which is seen thru Extended Events), co nie jest odpowiednie , ponieważ nie jest w stanie wyczyścić wszystkich usuniętych wierszy

Problem utrzymuje się od czasów SQL Server 2005 RTM Enterprise

Jak próbowałem rozwiązać problem:

  • Próbowano wymusić operacje SCAN na indeksach klastrowych tabel
  • Próbowano wymusić operacje SCAN, które obejmowały całą zawartość kolumny BLOB w indeksach klastrowych tabel
  • system sp_clean_db_free_space & sp_clean_db_file_free_space
  • ręcznie dbp cleanpage (@dbid, @fileid, @page) dla wszystkich plików i stron w DB
  • indeks klastrowany odbudowuje i reorganizuje
  • odtwarzanie bazy danych
  • DBCC FORCEGHOSTCLEANUP

  • Po uruchomieniu zapytania:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
    

    Widzę miliony i dziesiątki milionów rekordów duchów, ale tylko dla typu jednostki alokacji LOB_DATA

Jedyne rzeczy, które pomagają:

  • zatrzymanie serwera za pomocą polecenia SHUTDOWN lub zrestartowanie całego hosta - pomaga, po ponownym uruchomieniu proces GHOST CLEANUP działa kilka godzin i faktycznie czyści wszystkie widmowe rekordy
  • DBCC SHRINKFILE z opcją EMPTYFILE - przeniesienie wszystkich danych z jednego pliku do innego lub nowo utworzonych plików czyści rekordy duchów tylko w tym pliku - problem polega na tym, że naprawdę nie znoszę operacji zmniejszania. I zajmuje to 3-4 dni na JEDEN plik

pytanie - czy istnieje jakiś programowy (preferowany) lub konserwacyjny sposób na wymuszenie GHOST CLEANUP bez przestoju serwera, ponieważ przestój serwera kosztuje zbyt dużo, a nawet jest nie do przyjęcia - wynosi od tysięcy do dziesiątek tysięcy $ za godzinę

Problemy zostały zauważone, podobnie jak moje są tutaj:

I to samo jest tutaj:

Oleg Dok
źródło

Odpowiedzi:

12

Wreszcie MS rozpoznało problem jako błąd: http://support.microsoft.com/kb/2622823

Krótko: jest to ustalone

  • Sql Server 2008 SP3 CU4
  • Sql Server 2008 R2 CU10
  • Sql Server 2008 R2 SP1 CU4

W Sql Server 2012 SP1 problem nie występuje przez ponad rok działania.

Oleg Dok
źródło
3

To jest pytanie, które należy skierować do CSS, aby mogli rozwiązać problem z tobą. Prawdopodobnie masz gwarancję oprogramowania i umowę wsparcia. Jeśli nie masz kilkuset dolców, nie powinno to być aż tak wielkim problemem, jeśli ponowne uruchomienie instancji kosztuje tysiące dolarów za godzinę.

Czy próbowałeś zamknąć bazę danych, a następnie przejść do trybu online? Spowoduje to uruchomienie odzyskiwania po awarii i może skasować czyszczenie ducha.

Czy często piszesz do stołu? Czy często mam na myśli cały czas?

Co do MSKB 932115, czy widzisz, że rekordy duchów pozostały tylko we wszystkich plikach, czy też czyści pierwszy plik w grupie plików?

Dlaczego warto korzystać z -T1117 i natychmiastowego inicjowania pliku?

mrdenny
źródło
1. Na pewno pójdę do wsparcia MS. 2. Jeśli zamknę DB, podnosi około 10-30 minut, przewracając trans do przodu i do tyłu, co jest niedopuszczalne. 3. GC działa, ale nie przetwarza usuniętych wpisów LOB poza wierszem. 4. Pisanie na tabelach stale działa w zależności od pory dnia od 20 do 600 zapisów na sekundę i cały czas. 5. Pierwszy plik DB nie jest używany - nie ma dużych tabel i jest używany tylko jako pamięć systemowa, więc - po prostu nie ma żadnych zapisów o duchach.
Oleg Dok
z -T1117 Chcę po prostu rozłożyć całe obciążenie na kilka plików, zamiast tego, gdy pozostanie tylko jeden plik z grupy plików, gdzie wciąż istnieje wolne miejsce - zaczyna zwalniać na ZATRZASKACH PFS, natychmiastowa inicjalizacja pliku minimalizuje czas wzrostu plików, ponieważ przyrost jest ustawiony na 10-50 Gb na turę. Nie mogę po prostu ustawić plików tak dużych, jak tylko mogę, ponieważ jest to całkowicie nieprzewidywalne - które pliki otrzymają dzisiaj swoje dane i w jakim wolumenie. Łatwiej jest poprosić administratorów SAN o dodanie więcej miejsca, niż przewidzieć, do kogo powinienem dodać to miejsce.
Oleg Dok