PUNKT KONTROLNY lub COMMIT zapisuje na dysk?

12

Powiedzmy, dla SQLServer2008R2 i wyższych, z bazami danych w trybie pełnego odzyskiwania.

Zawsze myślałem :

  1. Po zatwierdzeniu transakcji (COMMIT) transakcja jest zapisywana w dzienniku transakcji w pamięci RAM.

  2. Kiedy pojawia się PUNKT KONTROLNY (po pewnym czasie i / lub niektóre transakcje i inne kryteria), transakcje między ostatnim PUNKTEM KONTROLNYM a bieżącym są zapisywane na dysku.

  3. Po wystąpieniu dziennika kopii zapasowej dane są zapisywane w pliku MDF.

Mam rację? Niektórzy z moich kolegów mówią, że się mylę i ciężko jest znaleźć poprawną odpowiedź, nawet z BOL.

Dzięki!

Patator
źródło

Odpowiedzi:

20

Niestety w odpowiedziach jest wiele błędów dotyczących działania COMMIT, więc dodam kolejny. Zobacz, jak to działa: Prezentacja we / wy SQL Servera Boba Dorra, aby uzyskać szczegółowe informacje oraz podstawy we / wy programu SQL Server 2000 . Oto jak to działa:

  • Wszystkie w pełni zarejestrowane zapisy danych (zmiany) zachodzą w dokładnie następującej kolejności (zobacz Zrozumienie, w jaki sposób SQL Server wykonuje zapytanie: Zapisywanie danych ):

    • Strona danych jest zatrzaśnięta wyłącznie
    • Zapis dziennika opisujący zmianę jest dodawany do dziennika w pamięci. Nowy rekord dziennika generuje nowy LSN, patrz Co to jest LSN: Numer sekwencji dziennika .
    • Strona danych jest modyfikowana (zarówno rekord danych, jak i ostatnia aktualizacja na stronie). To jest teraz zmodyfikowana („brudna”) strona.
    • Zatrzask strony danych jest zwolniony
    • w wyniku aktualizacji nic nie jest zapisywane na dysk bezpośrednio
  • COMMIT wykonuje następujące czynności

    • dodaje do pamięci nowy rekord dziennika opisujący COMMIT w pamięci
    • wszystkie rekordy dziennika, które nie zostały opróżnione na dysk, do wygenerowanego powyżej włącznie, są opróżniane (zapisywane na dysk)
    • bloki wątków czekają, aż system operacyjny zgłosi powyższy zapis jako trwały (wykonanie IO)
    • Instrukcja COMMIT (lub instrukcja DML z niejawnym zatwierdzeniem) została zakończona
  • PUNKT KONTROLNY wykonuje następujące czynności (uproszczone), zobacz Jak działają punkty kontrolne i co jest rejestrowane :

    • Wszystkie brudne strony w pamięci są zapisywane na dysku
      • Dla każdej brudnej strony, przed rozpoczęciem zapisu na dysk, loguje się do LSN włącznie z LSN, która jest ostatnią aktualizacją na tej stronie (zapisywana na dysk). Pamiętaj, że opróżnianie dowolnego LSN oznacza, że ​​wszystkie poprzednie LSN są również opróżniane, więc w przypadku najbardziej brudnych stron nie jest to możliwe, ponieważ jego własna ostatnia aktualizacja prawdopodobnie już została opróżniona.
    • zapis dziennika opisujący punkt kontrolny jest zapisywany w dzienniku i opróżniany
    • strona startowa bazy danych jest aktualizowana o LSN rekordu wygenerowanego powyżej

Zapisuje inaczej w przypadku operacji minimalnie rejestrowanych, patrz Operacje, które można rejestrować minimalnie . Mniej więcej minimalnie zarejestrowane operacje działają w następujący sposób (uproszczone):

  • Przed wstawieniem wierszy na stronie w ramach operacji minimalnie rejestrowanej generowany jest rekord dziennika opisujący fakt, że strona uczestniczy w operacjach minimalnie rejestrowanych i dołączany do dziennika (w pamięci)
  • Minimalnie zalogowana strona jest aktualizowana, ponieważ jest na niej napisanych wiele wstawek. Nic nie jest rejestrowane, nothign jest zapisywane na dysk.
  • Gdy zatwierdza się minimalnie zalogowana operacja, przed jej zatwierdzeniem wymagane jest, aby wszystkie strony, które uczestniczyły w minimalnie rejestrowanych operacjach w tej transakcji, były zapisywane na dysku. Onyl po zakończeniu tego zapisu rekord dziennika COMMIT można dołączyć do dziennika (w pamięci), a dziennik, włącznie z tym nowo dodanym rekordem dziennika zatwierdzania, jest opróżniany (zapisywany) na dysk.
Remus Rusanu
źródło
8

Po zatwierdzeniu transakcji (COMMIT) transakcja jest zapisywana w dzienniku transakcji w pamięci RAM.

Transakcja jest zapisywana w dzienniku transakcji, a nawet zmienia stronę lub dane zgodnie z zapytaniem. Jest to tak zwane zapisywanie z wyprzedzeniem (WAL). Jeśli SQL Server ulegnie awarii podczas aktualizacji strony w pamięci, WAL zapewnia, że ​​silnik DB może odczytać dziennik transakcji i wycofać transakcję. Jest to właściwość ACID RDBMS.

Kiedy pojawia się PUNKT KONTROLNY (po pewnym czasie i / lub niektóre transakcje i inne kryteria), transakcje między ostatnim PUNKTEM KONTROLNYM a bieżącym są zapisywane na dysku.

Punkt kontrolny opróżnia brudne strony z bufora na dysk. Zachowuje się trochę inaczej dla tempdb . Brudna strona to taka, która zmieniła się od czasu odczytu z dysku. Ten proces punktu kontrolnego tworzy znak w dzienniku transakcji do momentu, w którym transakcje zostały zatwierdzone. Po awarii odzyskiwanie wie, że wszystkie transakcje do tego znaku zostały popełnione. Możesz wydać punkt kontrolny ręcznie za pomocą polecenia TSQL.

Po wystąpieniu dziennika kopii zapasowej dane są zapisywane w pliku MDF.

Nie, po wystąpieniu dziennika kopii zapasowej SQL Server kopiuje informacje dziennika transakcji z pliku dziennika bazy danych na dysk, na którym zapisujesz kopię zapasową. Operacja tworzenia kopii zapasowej odczytuje dane z dysku i zapisuje dane na dysku.

Chciałbym, abyś przeczytał poniższe linki

Zrozumienie rejestrowania i odzyskiwania w SQL Server Wskazał już Mark

SQL Server 2008 Wewnętrzne i książka rozwiązywania problemów

Architektura i zarządzanie dziennikiem transakcji

Shanky
źródło
Ok, wydaje się jasne. Tylko dla pewności: kiedy dzieje się COMMIT, mówisz, że jest zapisywany w dzienniku transakcji; masz na myśli bufor lub dysk (LDF)?
Patator
Zawsze będzie najpierw zapisywane w pamięci podręcznej dziennika, a następnie opróżniane w dzienniku transakcji na dysku. Dodałem link do zarządzania dziennikiem transakcji, zapoznaj się z nim, aby dowiedzieć się, jak działa WAL
Shanky,
„Jeśli SQL Server ulegnie awarii podczas aktualizacji strony w pamięci, WAL zapewnia, że ​​silnik DB może odczytać dziennik transakcji i wycofać transakcję.” Jest to prawdą tylko wtedy, gdy transakcja nie została zatwierdzona. Jeśli zostało już popełnione, nic nie może zostać wycofane. Informacje w dzienniku transakcji służą do aktualizacji plików danych. Nawet jeśli bufor nie został zapisany w pliku danych przed awarią.
miracle173
@Miracle: Myślę, że jeśli strona jest aktualizowana, co jest związane z konkretną transakcją, oczywiście transakcja nie zostałaby popełniona.
Shanky
4

Poniżej wyjaśnimy ci rzeczy:

Po zatwierdzeniu transakcji (COMMIT) transakcja jest zapisywana w dzienniku transakcji w pamięci RAM.

  • COMMIT (lub BEGIN) nie ma nic wspólnego z modelem odzyskiwania. Jest na poziomie transakcji. Transakcja musi zostać całkowicie zakończona lub nie powieść się ( pamiętaj właściwości ACID ). Zasadniczo COMMIT oznaczy koniec udanej transakcji (niejawnej lub jawnej). Instrukcja COMMIT zagwarantuje, że wszystkie modyfikacje transakcji staną się stałą częścią bazy danych.
  • W celu wprowadzenia jakichkolwiek zmian SQL Server użyje WAL (rejestrowanie z wyprzedzeniem), w którym najpierw opisuje w dzienniku wszelkie zmiany, które zamierza wprowadzić, przed modyfikacją danych.

Kiedy pojawia się PUNKT KONTROLNY (po pewnym czasie i / lub niektóre transakcje i inne kryteria), transakcje między ostatnim PUNKTEM KONTROLNYM a bieżącym są zapisywane na dysku.

Po wystąpieniu dziennika kopii zapasowej dane są zapisywane w pliku MDF.

Odnosić się do :

Kin Shah
źródło