Jak zapobiec zapełnianiu dziennika transakcji podczas reorganizacji indeksu?

19

Mamy wiele komputerów, na których wstępnie przypisaliśmy rozmiar dziennika transakcji do 50 GB. Rozmiar stołu, który próbuję zreorganizować, wynosi 55–60 GB, ale będzie się stale zwiększał. Głównym powodem, dla którego chcę się zreorganizować, jest odzyskanie miejsca i wszelkie korzyści związane z wydajnością z tego powodu to dodatkowy bonus.

Poziom fragmentacji tabeli wynosi 30–35%. Na niektórych z tych komputerów pojawia się błąd „dziennik transakcji pełny” i reorganizacja kończy się niepowodzeniem. Rozmiar dziennika transakcji dochodzi do 48 GB. Jaki jest dobry sposób, aby temu przeciwdziałać? Nie mamy włączonego automatycznego przyrostu i niechętnie to robię.

Mogę zwiększyć rozmiar dziennika do większej wartości, ale ponieważ rozmiar tabeli wzrośnie w przyszłości, wartość może być niewystarczająca. Poza tym nie ma sensu przeprowadzania reorganizacji w celu odzyskania miejsca, jeśli mam równomiernie zwiększyć rozmiar kłody. Wszelkie pomysły na to, jak mogę skutecznie temu przeciwdziałać? Korzystanie z trybu zbiorczego nie jest możliwe, ponieważ utrata danych jest niedopuszczalna.

Paul White mówi GoFundMonica
źródło

Odpowiedzi:

7

Najlepszą praktyką jest REORGANIZErozdrobnienie poniżej około 30%, a REBUILDpowyżej tego. Po prostu REBUILDtworzy czystą kopię, REORGANIZErobi to na miejscu.

Sprawdź, co faktycznie robisz: nie masz planu konserwacji, który robisz?

Na większych stołach (zbliża się stół o pojemności 50 GB) widziałem, że REORGANIZEzużywasz całe miejsce w dzienniku transakcji, jeśli przestrzegasz tej reguły. Nie często: tylko jeden system z określonym wzorcem obciążenia. Po REORGANIZEprostu działał, aż dziennik się rozwinął i zużył całe miejsce na dysku.

REBUILDZamiast tego przeszliśmy na bez problemów, ale zignorowaliśmy fragmentację poniżej 25%. To działało dla nas lepiej: musisz sprawdzić, czy to działa dla Ciebie.

REBUILDmoże mieć wpływ na wydajność bardziej niż REORGANIZEprodukcyjny, ale czasami można to złagodzić za pomocą ONLINEopcji (wymagana edycja Enterprise).

gbn
źródło
Bardzo pomocne są ogólne liczby i rozmowy zarówno w kategoriach jakościowych, jak i ilościowych.
Robino
6

REORGANIZACJA (jak w ALTER INDEX ... REORGANIZE) to bardzo szybka operacja (cóż, głównie ...), która wymaga niewielkiej ilości logów, może zostać w dowolnym momencie przerwana i wznowiona, i działa wewnętrznie w małych transakcjach wsadowych :

defragmentacja jest przeprowadzana jako seria krótkich transakcji, więc duży dziennik nie jest konieczny, jeśli kopie zapasowe dziennika są często wykonywane lub jeśli ustawienie modelu odzyskiwania jest PROSTE.

Czy na pewno nie mówisz o przebudowie ? Indeks REBUILD jest powolny, drogi, zużywa ogromną ilość logów (jeśli nie jest offline i nie może być minimalnie zalogowany , odbudowanie online nie może być minimalnie zalogowany), jest pojedynczą gigantyczną transakcją i nie można go przerwać bez utraty całej pracy.

Wydaje mi się, że przeprowadzasz przebudowę, co jest naprawdę wyjątkową operacją, której nie powinieneś robić, chyba że masz bardzo dobrze przemyślany powód. Jakiego rodzaju odzyskiwania przestrzeni marzysz? Coś, DBCC CLEANTABLEco nie poradzi? Czy sprawdziłeś fizyczną strukturę tabeli, czy odeszła ona od struktury logicznej (szczegółowe informacje znajdują się w kolumnach tabeli programu SQL Server pod maską )?

Jeśli naprawdę musisz odbudować stół, obawiam się, że nie masz innego wyjścia, jak ugryźć kulę i przydzielić niezbędny dziennik. Nie pozwól, aby auto rosło, to tylko spowolni proces. Wstępnie wyhoduj go do 2,5-krotności wielkości stołu.

Jeśli tabela jest podzielona na partycje, możesz odbudować offline (i zreorganizować) jedną partycję na raz. Przebudowę online można wykonać tylko na poziomie całego stołu.

Remus Rusanu
źródło
2
robię reorganizację. model odzyskiwania jest pełny i widzę duży rozmiar dziennika transakcji. przyczyną niepowodzenia jest jedno z dwóch 1. kopii lustrzanych. log musi zostać przekazany do pomocniczego, zanim będzie można odzyskać miejsce 2. kopie zapasowe dziennika. Mimo że wykonujemy kopie zapasowe co 15 minut, czasami nie udaje się z tego powodu.
Ta sama sytuacja tutaj, 2008R2, reorganizacja indeksu (nie przebudowywanie), a nawet w trybie prostym (!) Tlog rośnie do wielkości większej niż największy stół, który wynosi> 40 GB. W trybie pełnego odzyskiwania robienie 5-minutowych kopii zapasowych dziennika również nie pomaga, podczas ponownego indeksowania tworzony jest tylko jeden ogromny plik kopii zapasowej TRN. Nie wydaje się to mieć sensu, ale jest takie samo zachowanie na dwóch różnych serwerach. Jakiś pomysł, jak faktycznie podzielić to na małe transakcje wsadowe, jak udokumentowano?
realMarkusSchmidt
5

Miałem już ten problem.

  • Masz dużą bazę danych i mały dysk dziennika. Chcesz się zreorganizować (z różnych powodów).
  • Gdy spróbujesz to zrobić na dużej pofragmentowanej tabeli, dziennik zapełni się, dopóki dysk dziennika nie zostanie zapełniony, a następnie polecenie zostanie przerwane.
  • Jeśli jest w trybie prostym, inne transakcje mogą zakończyć się niepowodzeniem, dopóki dziennik nie zostanie wyczyszczony w następnym punkcie kontrolnym, a jeśli jest w trybie pełnym, inne transakcje mogą zakończyć się niepowodzeniem do momentu utworzenia kolejnej kopii zapasowej dziennika. Czop!
  • Jeśli jesteś w trybie pełnym, zwiększasz częstotliwość tworzenia kopii zapasowej dziennika, ale to nie pomaga uniknąć problemu, ponieważ reorganizacja odbywa się w ramach transakcji niejawnej, dziennik nie jest czyszczony, dopóki transakcja nie zakończy się, nie zostanie przerwana lub zatrzymana.
  • I NAPRAWDĘ chcesz, aby reorganizacja przebiegła do końca.

Jest to trochę sprzeczne z intuicją, ponieważ wiesz, że jeśli przerwiesz reorganizację, możesz kontynuować od miejsca, w którym została przerwana, po prostu przerwanie dokonuje transakcji, a nie wycofuje.

Oto co robisz. Jest trochę długi, ale prosty.

  • Rozwiń wstępnie plik dziennika do stosunkowo dużego rozmiaru, ale nie maksymalnego. Zasadniczo chcesz zostawić wystarczająco dużo miejsca na użyteczne prace, a także na niektóre niewielkie wzrosty, jeśli wystąpią, aby normalne operacje się nie zatrzymały.
  • Utwórz zadanie, aby uruchomić reorganizację indeksu („Reorganizuj”).
  • Utwórz alert WMI agenta („Reorganizuj zawór nadmiarowy”) pod warunkiem wydajności.

    • Obiekt: SQLServer: Bazy danych
    • Licznik: wykorzystano dziennik procentowy
    • Instancja: (Twoja duża nazwa bazy danych)
    • Alarmuj, jeśli licznik wzrośnie powyżej: 80
    • Odpowiedź: Wykonaj zadanie („Reorganizuj czek”)
  • Utwórz pracę („Reorganizuj czek”)

    • W zadaniu sprawdź msdb.dbo.sysjobactivity, aby sprawdzić, czy uruchomione jest zadanie „Reorganizuj”. A jeśli to jest ...
    • Zatrzymaj zadanie i odpytuj, aż się zatrzyma. Może to potrwać kilka sekund.
    • (Jeśli jesteś w trybie pełnym) Uruchom zadanie tworzenia kopii zapasowej dziennika i potwierdź jego zakończenie.
    • Sprawdź dokładnie sys.dm_os_performance_counters, że licznik wolnego miejsca w dzienniku zmniejszył się poniżej progu.
    • Rozpocznij zadanie „Reorganizuj”.
  • Sprawdź to wszystko gdzieś, nawet w piaskownicy programistycznej, aby upewnić się, że działa poprawnie przed przyklejeniem go do serwera produkcyjnego.

Zobaczysz, że zadanie „Reorganizacja” rozpoczyna się i zaczyna wypełniać dziennik. Gdy dziennik zapełni się w procentach, uruchamia alarm WMI (w ciągu około 30 sekund), który uruchamia inne zadanie, w którym widać, że zadanie „Reorganizacja” jest uruchomione, a więc prawdopodobnie jest z winy. Następnie zatrzymuje „Reorganizację”, wykonuje kopię zapasową, potwierdza, że ​​ilość wolnego miejsca w dzienniku powróciła do rozsądnej wartości, a następnie ponownie rozpoczyna zadanie „Reorganizacja”, które rozpocznie od miejsca, w którym zostało przerwane.

Tak więc, jak możesz, powodem, dla którego wstępnie przeskalowałeś dziennik do rozsądnej wartości w tym scenariuszu, jest zmniejszenie liczby wzrostu / wyzwalacza / zadania / zatrzymania / ponownego uruchomienia, aby mógł być bardziej wydajny, a także zachować wystarczającą ilość miejsca na sporadyczne wzrosty, które nie są łapane w czasie.

To rodzaj dziwnego scenariusza. Jestem prawie pewien, że bym sobie z tego poradził kilka lat temu i oczywiście są tutaj podstawowe podstawowe problemy. Ale jeśli masz do czynienia z setkami serwerów, pojawi się kilka takich przypadków, które nie mogą być rozwiązane w żaden sposób, z jakiegokolwiek powodu biznesowego, z wyjątkiem MacGyvering tymczasowego rozwiązania, które wykona zadanie.

Tak długo, jak jest to bezpieczne, logiczne, przetestowane i dobrze udokumentowane, nie powinno być problemu.

Cody Konior
źródło
1

Tak zwykle robiłem (mam też kilka tabel o wielkości 80 + GB każda) dla indeksu reorg (ponieważ reorg indeksu można zatrzymać w dowolnym momencie bez utraty poprzedniej pracy reorg).

  1. Podczas ponownego indeksowania zwiększę kopię zapasową tlog z mojej regularnej częstotliwości 30 minut do każdej częstotliwości 10 minut
  2. Mam kolejną sesję sprawdzającą wolne miejsce na tlog co 1 minutę, a jeśli wolne miejsce na tlog jest poniżej progu, zatrzymam sesję reorg indeksu i rozpocznę (lub poczekam) kopię zapasową tlog. Następnie ponownie uruchom indeks reorg.

W mojej strukturze obsługi indeksów dzielę indeksy na dwie grupy, jedna dotyczy odbudowy indeksu, a druga reorg indeksu. W przypadku przebudowy indeksu zastosuję nieco inne podejście, ponieważ nie chcę przerywać sesji przebudowywania indeksu (co spowoduje wycofanie i utratę całej poprzedniej pracy). Podczas odbudowy indeksu, jeśli moja sesja monitorowania zauważy scenariusz zajętego miejsca w pliku tlog, sesja monitorowania automatycznie zwiększy plik tlog, aw najgorszym scenariuszu (tj. Dysk jest pełny), moja sesja monitorowania utworzy inny plik dziennika ( ale później upuszczę go na innym dysku (dysku zapasowym)

jyao
źródło
1

Miałem ten sam problem co autor pytania i patrząc na jego komentarze, mogę powiedzieć, że miałem taką samą konfigurację. Podczas gdy próbowałem zrobić REORGANIZE, dziennik staje się pełny, niezależnie od wielkości, nawet do wielokrotności wielkości całego stołu.

Przyczyną problemu była replikacja transakcyjna . Najwyraźniej nie można wykonać kopii zapasowej dziennika, dopóki REORGANIZEoperacja nie zostanie zakończona. Czytałem gdzieś, że był to znany problem Microsoftu, ale nie jestem pewien, gdzie.

Po wyłączeniu replikacji transakcyjnej kopie zapasowe dziennika znów działały normalnie, a tworzenie kopii zapasowych dziennika co 30 sekund podczas reorganizacji działało dobrze.

IUmpierrez
źródło
0

Zakładam, że prowadzisz coś w stylu:

ZMIENIĆ INDEKS REORGANIZACJI

Niestety nie ma możliwości uruchomienia częściowej organizacji (na przykład można częściowo zmniejszyć plik dziennika). Sposoby myślenia o tych problemach to:

1) ustaw bazę danych na prosty tryb odzyskiwania podczas uruchamiania reorganizacji, ale powiedziałeś, że jest to nie do przyjęcia

2) podziel indeks na partycje - jeśli możesz wymyślić sposób podzielenia indeksu na partycje o równej wielkości, będziesz mógł ponownie zorganizować (lub przebudować z opcją online) każdą partycję niezależnie, a tym samym ograniczyć wzrost pliku dziennika

Jestem pewien, że to robisz, ale jeśli nie, możesz zainicjować tworzenie kopii zapasowej pliku dziennika przed i po optymalizacji indeksu, co pozwoli mu odzyskać zajęte miejsce.


źródło