Udostępnij za pośrednictwem


Spójne odzyskiwanie powiązanych baz danych przy użyciu oznaczonych transakcji

Dotyczy:programu SQL Server

Ten temat dotyczy tylko baz danych programu SQL Server korzystających z pełnych lub zbiorczo zarejestrowanych modeli odzyskiwania.

Podczas wprowadzania powiązanych aktualizacji do co najmniej dwóch baz danych powiązanych baz danychmożna użyć znaczników transakcji, aby przywrócić je do logicznie spójnego punktu. Jednak podczas tego odzyskiwania utracone są wszystkie transakcje zatwierdzone po punkcie oznaczonym jako punkt odzyskiwania. Oznaczanie transakcji jest odpowiednie tylko wtedy, gdy testujesz powiązane bazy danych lub gdy chcesz utracić ostatnio zatwierdzone transakcje.

Rutynowe oznaczanie powiązanych transakcji w każdej powiązanej bazie danych ustanawia szereg typowych punktów odzyskiwania w bazach danych. Znaczniki transakcji są rejestrowane w dzienniku transakcji i uwzględniane w kopiach zapasowych dziennika. W przypadku awarii można przywrócić każdą z baz danych do tego samego znacznika transakcji, aby odzyskać je do spójnego punktu.

Notatka

Kopie zapasowe dzienników w różnych bazach danych można tworzyć niezależnie od siebie i nie muszą być równoczesne.

Odzyskiwanie powiązanych baz danych w następujących scenariuszach wymaga, aby transakcje zostały już oznaczone w każdej powiązanej bazie danych:

  • Co najmniej jeden dziennik transakcji jest niszczony. Należy przywrócić zestaw baz danych do spójnego stanu w momencie utworzenia ostatniej kopii zapasowej dziennika.

  • Należy przywrócić cały zestaw baz danych do wzajemnie spójnego stanu we wcześniejszym punkcie w czasie.

Ważny

Powiązane bazy danych można odzyskać tylko do oznaczonej transakcji, a nie do określonego punktu w czasie.

Aby uzyskać informacje na temat tworzenia transakcji oznaczania, zobacz "Tworzenie oznaczonych transakcji", w dalszej części tego tematu.

Typowy scenariusz użycia oznaczonych transakcji

Typowy scenariusz użycia oznaczonych transakcji obejmuje następujące kroki:

  1. Utwórz pełną lub różnicową kopię zapasową każdej z powiązanych baz danych.

  2. Oznacz blok transakcji we wszystkich bazach danych.

  3. Utwórz kopię zapasową dziennika transakcji dla wszystkich baz danych.

  4. Przywracanie kopii zapasowych bazy danych PRZY UŻYCIU FUNKCJI NORECOVERY.

  5. Przywracanie dzienników z użyciem opcji STOPATMARK.

Zagadnienia dotyczące używania oznaczonych transakcji

Przed dodaniem nazwanych znaczników do dziennika transakcji należy wziąć pod uwagę następujące kwestie:

  • Ponieważ znaczniki transakcji zużywają miejsce w dzienniku, należy ich używać tylko w przypadku transakcji, które odgrywają znaczącą rolę w strategii odzyskiwania bazy danych.

  • Po zatwierdzeniu oznaczonej transakcji wiersz jest wstawiany do tabeli logmarkhistory w msdb.

  • Jeśli oznaczona transakcja obejmuje wiele baz danych na tym samym serwerze bazy danych lub na różnych serwerach, znaczniki muszą być rejestrowane w dziennikach wszystkich baz danych, których dotyczy problem.

Tworzenie oznaczonych transakcji

Aby utworzyć oznaczoną transakcję, użyj instrukcji BEGIN TRANSACTION i klauzuli WITH MARK [description] . Opcjonalny opis to tekstowy opis znacznika. Wymagana jest nazwa oznaczenia dla transakcji. Można ponownie użyć nazwy znacznika. Dziennik transakcji rejestruje nazwę oznaczenia, opis, bazę danych, użytkownika, informacje o dacie i czasie oraz numer sekwencji dziennika (LSN). Informacje o dacie/godziny są używane wraz z nazwą znacznika, aby jednoznacznie zidentyfikować znacznik.

Aby utworzyć oznaczone transakcje w zestawie baz danych:

  1. Nazwij transakcję w instrukcji BEGIN TRAN i użyj klauzuli WITH MARK

    Można zagnieżdżać instrukcję BEGIN TRAN new_mark_name WITH MARK wewnątrz istniejącej transakcji. Wartość new_mark_name to nazwa znacznika transakcji, nawet jeśli transakcja ma swoją nazwę.

    Notatka

    W przypadku wydania drugiego zagnieżdżonego BEGIN TRAN...WITH MARK, ta instrukcja jest pomijana, ale powoduje wyświetlenie komunikatu ostrzegawczego.

  2. Uruchom aktualizację dla wszystkich baz danych w zestawie.

    Znacznik dla określonej transakcji jest wstawiany do dzienników transakcji tylko w tym wystąpieniu serwera, gdzie wykonywana jest instrukcja BEGIN TRAN...WITH MARK. Znacznik transakcji jest umieszczany w dzienniku transakcji każdej bazy danych zaktualizowanej przez oznaczoną transakcję w tym wystąpieniu serwera. Jeśli bazy danych znajdują się w różnych wystąpieniach serwera, należy utworzyć identyczne znaczniki w każdym wystąpieniu serwera.

Przykłady

Poniższy przykład przywraca dziennik transakcji do oznaczonego punktu w transakcji oznaczonej jako ListPriceUpdate.

USE AdventureWorks2022;
GO  
BEGIN TRANSACTION ListPriceUpdate  
   WITH MARK 'UPDATE Product list prices';  
GO  
  
UPDATE Production.Product  
   SET ListPrice = ListPrice * 1.10  
   WHERE ProductNumber LIKE 'BK-%';  
GO  
  
COMMIT TRANSACTION ListPriceUpdate;  
GO  
  
-- Time passes. Regular database   
-- and log backups are taken.  
-- An error occurs in the database.  
USE master  
GO  
  
RESTORE DATABASE AdventureWorks  
FROM AdventureWorksBackups  
WITH FILE = 3, NORECOVERY;  
GO  
  
RESTORE LOG AdventureWorks  
   FROM AdventureWorksBackups   
   WITH FILE = 4,  
   RECOVERY,   
   STOPATMARK = 'UPDATE Product list prices';  

Wymuszanie propagacji znaku na inne serwery

Nazwa znacznika transakcji nie jest automatycznie dystrybuowana na inny serwer, ponieważ transakcja rozprzestrzeni się tam. Aby wymusić rozłożenie znaku na inne serwery, należy napisać procedurę składowaną zawierającą nazwę BEGIN TRAN WITH MARK. Następnie procedura składowana musi być wykonana na serwerze zdalnym w ramach transakcji rozpoczętej na serwerze źródłowym.

Rozważmy na przykład partycjonowaną bazę danych, która istnieje w wielu wystąpieniach programu SQL Server. W każdym wystąpieniu jest baza danych o nazwie coyote. Najpierw w każdej bazie danych utwórz procedurę składowaną, na przykład sp_SetMark.

CREATE PROCEDURE sp_SetMark  
@name nvarchar (128)  
AS  
BEGIN TRANSACTION @name WITH MARK  
UPDATE coyote.dbo.Marks SET one = 1  
COMMIT TRANSACTION;  
GO  

Następnie utwórz procedurę składowaną sp_MarkAll zawierającą transakcję, która umieszcza znacznik w każdej bazie danych. sp_MarkAll można uruchomić z dowolnego wystąpienia.

CREATE PROCEDURE sp_MarkAll  
@name nvarchar (128)  
AS  
BEGIN TRANSACTION  
EXEC instance0.coyote.dbo.sp_SetMark @name  
EXEC instance1.coyote.dbo.sp_SetMark @name  
EXEC instance2.coyote.dbo.sp_SetMark @name  
COMMIT TRANSACTION;  
GO  

zatwierdzenie Two-Phase

Zatwierdzanie transakcji rozproszonej odbywa się w dwóch fazach: przygotowanie i zatwierdzenie. Po zatwierdzeniu oznaczonej transakcji, rekord dziennika zatwierdzeń dla każdej bazy danych w tej transakcji jest umieszczany w dzienniku w momencie, gdy w żadnym z dzienników nie ma transakcji wątpliwych. W tym momencie gwarantowane jest, że w jednym dzienniku nie ma żadnych transakcji, które są wyświetlane jako zatwierdzone, ale nie są zatwierdzane w innym dzienniku.

Następujące kroki są wykonywane podczas zatwierdzania oznaczonej transakcji:

  1. Przygotowywanie fazy oznaczania transakcji wstrzymuje wszystkie nowe przygotowania i zatwierdzenia.

  2. Tylko zatwierdzenia już przygotowanych transakcji mogą być kontynuowane.

  3. Oznaczenie transakcji, a następnie oczekiwanie na opróżnienie wszystkich przygotowanych transakcji z upływem limitu czasu.

  4. Oznaczona transakcja jest gotowa i zatwierdzona.

  5. Usunięto opóźnienie w nowych procesach przygotowywania i zatwierdzania.

Zawieszenia generowane przez oznaczone transakcje obejmujące wiele baz danych mogą zmniejszyć wydajność przetwarzania transakcji serwera.

Zalecamy, aby nie uruchamiać równoczesnych oznaczonych transakcji. Jest to rzadkie, ale możliwe, że zatwierdzanie rozproszonej oznaczonej transakcji spowoduje zakleszczenie z innymi rozproszonymi oznaczonymi transakcjami, które są zatwierdzane w tym samym czasie. W takim przypadku transakcja znakowania jest wybierana jako ofiara zakleszczenia i jest wycofywana. W przypadku wystąpienia tego błędu aplikacja może ponowić próbę oznaczonej transakcji. Kiedy wiele transakcji oznaczonych próbuje zatwierdzić się jednocześnie, istnieje większe prawdopodobieństwo blokady.

Odzyskiwanie do oznaczonej transakcji

Aby uzyskać informacje na temat odzyskiwania bazy danych zawierającej oznaczone transakcje do lub tuż przed określonym znacznikiem, zobacz Odzyskiwanie powiązanych baz danych zawierających oznaczone transakcje.

Zobacz też

ROZPOCZYNANIE TRANSAKCJI ROZPROSZONEJ (Transact-SQL)
tworzenie kopii zapasowych i przywracanie systemowych baz danych (SQL Server)
ROZPOCZNIJ TRANSAKCJĘ (Transact-SQL)
stosowanie kopii zapasowych dziennika transakcji (SQL Server)
Pełne kopie zapasowe bazy danych (SQL Server)
RESTORE (Transact-SQL)
Odzyskiwanie powiązanych baz danych zawierających oznaczone transakcje