Wyłącz dziennik transakcji

79

Oracle ma polecenia SQL, które można wydać, aby transakcja nie została zarejestrowana. Czy jest coś podobnego w przypadku programu SQL Server 2008?

Mój scenariusz: Potrzebujemy dzienników Tx na serwerach (Dev, QA, Prod), ale być może da się bez nich obejść na maszynach deweloperskich.

Raj Więcej
źródło
1
czy próbowałeś używać widoków do obliczonych danych?
Przepraszam, że przechwytuję twoje pytanie, ale jak wyłączyć logowanie transakcji w Oracle dla określonej procedury / zapytania? Dziękuję Ci!
Victor,
3
@Kaushik, lepiej zadaj to pytanie, ponieważ jest to własne pytanie.
Raj More
aby transakcja nie została zarejestrowana ” to nie jest prawda, jeśli odnosisz się do NOLOGGEDopcji.
a_horse_with_no_name
@RajMore Czy dowiedziałeś się czegoś więcej na ten temat? W naszym przypadku wykonujemy ładowanie zbiorcze i zaskakujące było to, że tak dużo danych jest ładowanych na dysk w trybie PROSTYM. Teraz rozumiem dlaczego, ale zastanawiam się, jak bardzo wydajność mogłaby wzrosnąć, gdyby udało się wyeliminować rejestrowanie transakcji.
D-Klotz

Odpowiedzi:

124

W żadnych okolicznościach nie można obejść się bez dzienników transakcji w programie SQL Server. Silnik po prostu nie będzie działał.

Możesz ustawić swój model odzyskiwania na PROSTY na swoich maszynach deweloperskich - co zapobiegnie rozdęciu dziennika transakcji, gdy kopie zapasowe dziennika tran nie zostaną wykonane.

ALTER DATABASE MyDB SET RECOVERY SIMPLE;
Aaron Alton
źródło
18
Tylko DUŻA uwaga: ta odpowiedź jest w 100% poprawna technicznie. Ale jest to wyłącznie coś, czego chciałbyś używać na swoich maszynach DEVELOPER lub gdy NIE zależy ci na możliwości tworzenia kopii zapasowych danych. Więcej informacji i tło można znaleźć na stronach sqlservervideos.com/video/logging-essentials i sqlservervideos.com/video/shrinking-log-files .
Michael K. Campbell
Lub w przypadku baz danych w usługach RDS (lub równoważnych usługach), w których strategia tworzenia kopii zapasowych wykorzystuje migawki, a nie dzienniki transakcji.
bsplosion
lub baza danych jest zbudowana z innego źródła, np. źródła zdarzeń, więc nie ma transakcji i nie ma potrzeby rejestrowania
Anthony Johnston
45

SQL Server wymaga dziennika transakcji do działania.

To powiedziawszy, istnieją dwa tryby działania dziennika transakcji:

  • Prosty
  • Pełny

W trybie pełnym dziennik transakcji rośnie do momentu utworzenia kopii zapasowej bazy danych. W trybie prostym : miejsce w dzienniku transakcji jest „odzyskiwane” w każdym punkcie kontrolnym .

Bardzo niewiele osób ma potrzebę uruchamiania swoich baz danych w modelu pełnego odzyskiwania. Jedynym celem korzystania z modelu pełnego jest to, że chcesz wykonać kopię zapasową bazy danych kilka razy dziennie, a tworzenie kopii zapasowej całej bazy danych zajmuje zbyt dużo czasu - wystarczy więc wykonać kopię zapasową dziennika transakcji.

Dziennik transakcji rośnie przez cały dzień, a Ty tworzysz jego kopię zapasową. Tej nocy wykonujesz pełną kopię zapasową, a następnie SQL Server obcina dziennik transakcji, zaczyna ponownie wykorzystywać miejsce przydzielone w pliku dziennika transakcji.

Jeśli robisz tylko pełne kopie zapasowe bazy danych , nie chcesz trybu pełnego odzyskiwania.

Ian Boyd
źródło
Jest to trochę błędne: musisz wykonać kopię zapasową dziennika, aby (miejmy nadzieję) zatrzymać wzrost dziennika transakcji. Oczywiście, jeśli masz otwartą transakcję lub dużą transakcję, dziennik będzie się powiększał, ponieważ wewnętrzne alokacje plików dziennika (VLF) nie mogą być ponownie wykorzystane lub potrzebujesz więcej. Tak przy okazji, to krótki przegląd, a nie rozdział i werset
gbn
1
@gbn Nie tworzysz kopii zapasowej dziennika, aby zatrzymać wzrost dziennika. To znaczy zrobić , ale to nie jest punkt z tej funkcji. Firma Microsoft nie utworzyła dziennika transakcji, aby zagrać w grę „zużyj cały dysk twardy, ponieważ zapomniałeś wykonać kopię zapasową dziennika” . Powodem dziennik rośnie (i wtedy wymaga tworzenia kopii zapasowych, aby zatrzymać je z hodowli), jest tak, że można wykonać kopię zapasową tylko dziennik.
Ian Boyd
44

Istnieje trzeci tryb odzyskiwania, o którym nie wspomniano powyżej. Tryb odzyskiwania ostatecznie określa, jak duże stają się pliki LDF i jak często są zapisywane. W przypadkach, w których zamierzasz wykonywać dowolne typy wstawiania zbiorczego, powinieneś ustawić DB na "BULK / LOGGED". To sprawia, że ​​wkładki masowe przesuwają się szybko i można je zmieniać w locie.

Aby to zrobić,

USE master ;
ALTER DATABASE model SET RECOVERY BULK_LOGGED ;

Aby zmienić to z powrotem:

USE master ;
ALTER DATABASE model SET RECOVERY FULL ;

W duchu dodania do rozmowy o tym, dlaczego ktoś nie chciałby LDF-a, dodam: Robimy modelowanie wielowymiarowe. Zasadniczo używamy bazy danych jako dużego magazynu zmiennych, które są przetwarzane zbiorczo przy użyciu programów zewnętrznych. NIGDY nie wymagamy wycofania. Gdybyśmy mogli uzyskać wzrost wydajności, wyłączając rejestrowanie WSZYSTKICH, wzięlibyśmy to w mgnieniu oka.

NameIsPete
źródło
1
Dzięki za to. Używamy bazy danych dokładnie w ten sam sposób. Nie mogliśmy mniej przejmować się możliwością wycofania się. Czysta wydajność to wszystko, czego szukamy
Dan,
W tym scenariuszu możesz rozważyć inną bazę danych, taką jak Mongo (umożliwia wyłączanie dzienników) lub w pamięci (redis i inne)
Tim
2

Jaki jest twój problem z dziennikami Tx? Oni rosną? Następnie wystarczy ustawić opcję obcinania w punkcie kontrolnym.

Z dokumentacji Microsoft:

W SQL Server 2000 lub SQL Server 2005 „Prosty” model odzyskiwania jest odpowiednikiem „obcinania dziennika w punkcie kontrolnym” we wcześniejszych wersjach programu SQL Server. Jeśli dziennik transakcji jest obcinany za każdym razem, gdy na serwerze jest wykonywany punkt kontrolny, uniemożliwia to użycie dziennika do odtwarzania bazy danych. Do przywrócenia danych możesz użyć tylko pełnych kopii zapasowych bazy danych. Kopie zapasowe dziennika transakcji są wyłączone, gdy używany jest model odzyskiwania „Prosty”.

zvolkov
źródło
1
Cóż, problemy z przestrzenią - niektórzy deweloperzy mają starsze maszyny i możemy się bez nich obejść. Co więcej, jestem ciekaw, czy to w ogóle możliwe! Miałem wrażenie, że opcja „Obetnij logowanie w punkcie kontrolnym” została ustawiona tylko w trybie odzyskiwania prostego w SQL 2008. Czy jest inny sposób?
Raj More
1
@Tapori, to to samo. W 2000 roku zmienili jego nazwę.
zvolkov
0

Jeśli dotyczy to tylko maszyn deweloperskich, aby zaoszczędzić miejsce, po prostu przejdź do prostego trybu odzyskiwania i wszystko będzie dobrze.

Jednak na maszynach produkcyjnych zdecydowanie zalecamy utrzymanie baz danych w trybie pełnego odzyskiwania. Zapewni to, że w razie potrzeby będzie można przywrócić określony punkt w czasie.

Ponadto - posiadanie baz danych w trybie pełnego odzyskiwania może pomóc cofnąć przypadkowe aktualizacje i usunięcia, czytając dziennik transakcji. Zobacz poniżej lub więcej szczegółów.

Jak mogę wycofać zapytanie UPDATE w SQL Server 2005?

Przeczytaj plik dziennika (* .LDF) w sql server 2008

Jeśli przestrzeń jest problemem na maszynach produkcyjnych, po prostu utwórz częste kopie zapasowe dziennika transakcji.

JdMR
źródło