Delen via


Gemarkeerde transacties gebruiken om gerelateerde databases consistent te herstellen

van toepassing op:SQL Server-

Dit onderwerp is alleen relevant voor SQL Server-databases die gebruikmaken van de volledige of bulksgewijs vastgelegde herstelmodellen.

Wanneer u gerelateerde updates voor twee of meer databases aanbrengt, gerelateerde databases, kunt u transactiemarkeringen gebruiken om ze te herstellen naar een logisch consistent punt. Dit herstel verliest echter alle transacties die worden doorgevoerd na de markering die is gebruikt als het herstelpunt. Het markeren van transacties is alleen geschikt wanneer u gerelateerde databases test of wanneer u onlangs doorgevoerde transacties wilt verliezen.

Door gerelateerde transacties in elke gerelateerde database regelmatig te markeren, wordt een reeks algemene herstelpunten in de databases vastgelegd. De transactiemarkeringen worden vastgelegd in het transactielogboek en opgenomen in logboekback-ups. In het geval van een noodgeval kunt u elk van de databases herstellen naar dezelfde transactiemarkering om ze te herstellen naar een consistent punt.

Notitie

Logboekback-ups op de verschillende databases kunnen onafhankelijk van elkaar worden gemaakt en hoeven niet tegelijkertijd te zijn.

Voor het herstellen van gerelateerde databases in de volgende scenario's moet u al transacties in elke gerelateerde database hebben gemarkeerd:

  • Een of meer transactielogboeken worden vernietigd. Je moet de set van de databases herstellen naar een consistente status op het moment van uw laatste back-up van het logboek.

  • U moet de volledige set databases herstellen naar een wederzijds consistente status op een eerder tijdstip.

Belangrijk

U kunt gerelateerde databases alleen herstellen naar een gemarkeerde transactie, niet naar een specifiek tijdstip.

Zie 'De gemarkeerde transacties maken' verderop in dit onderwerp voor meer informatie over het maken van markeringstransacties.

Typisch scenario voor het gebruik van gemarkeerde transacties

Een typisch scenario voor het gebruik van gemarkeerde transacties omvat de volgende stappen:

  1. Maak een volledige of differentiële databaseback-up van elk van de gerelateerde databases.

  2. Een transactieblok markeren in alle databases.

  3. Maak een back-up van het transactielogboek voor alle databases.

  4. Herstel databaseback-ups met NORECOVERY.

  5. Herstel logboeken MET STOPATMARK.

Overwegingen voor het gebruik van gemarkeerde transacties

Houd rekening met het volgende voordat u benoemde markeringen in het transactielogboek invoegt:

  • Omdat transactiemarkeringen logboekruimte verbruiken, gebruikt u deze alleen voor transacties die een belangrijke rol spelen in de strategie voor databaseherstel.

  • Nadat een gemarkeerde transactie is doorgevoerd, wordt er een rij ingevoegd in de logboekmarkering tabel in msdb.

  • Als een gemarkeerde transactie meerdere databases op dezelfde databaseserver of op verschillende servers omvat, moeten de markeringen worden vastgelegd in de logboeken van alle betrokken databases.

Gemarkeerde transacties maken

Om een gemarkeerde transactie te maken, gebruikt u de instructie BEGIN TRANSACTION en de WITH MARK [description] clausule. De optionele beschrijving is een tekstuele beschrijving van het teken. Er is een markeringsnaam vereist voor de transactie. Een markeringsnaam kan opnieuw worden gebruikt. Het transactielogboek registreert de marknaam, beschrijving, database, gebruiker, datum/tijd-informatie en het logboekreeksnummer (LSN). De datum/tijd-informatie wordt samen met de markeringsnaam gebruikt om de markering uniek te identificeren.

Als u gemarkeerde transacties in een set databases wilt maken:

  1. Noem de transactie in de BEGIN TRAN-instructie en gebruik de WITH MARK-clause.

    U kunt de instructie BEGIN TRAN new_mark_name MET MERK nesten binnen een bestaande transactie. De waarde van new_mark_name is de marknaam voor de transactie, zelfs als de transactie een transactienaam heeft.

    Notitie

    Als u een tweede geneste BEGIN TRAN... MET MARK-instructie uitvoert, wordt die instructie overgeslagen, maar het veroorzaakt een waarschuwingsbericht.

  2. Voer een update uit voor alle databases in de set.

    De markering voor een specifieke transactie wordt in transactielogboeken alleen ingevoegd op de serverinstantie waar de BEGIN TRAN... de WITH MARK-instructie wordt uitgevoerd. De transactiemarkering wordt geplaatst in het transactielogboek van elke database die wordt bijgewerkt door de gemarkeerde transactie op die serverinstantie. Als de databases zich op verschillende serverexemplaren bevinden, moeten identieke markeringen worden gemaakt op elk van de serverexemplaren.

Voorbeelden

In het volgende voorbeeld wordt het transactielogboek hersteld naar de markering in de gemarkeerde transactie met de naam 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';  

Een markering afdwingen om te verspreiden naar andere servers

De naam van een transactiemarkering wordt niet automatisch naar een andere server gedistribueerd, omdat de transactie zich daar verspreidt. Om af te dwingen dat de markering wordt verspreid naar de andere servers, moet er een opgeslagen procedure worden geschreven die een BEGIN TRAN-met de naam WITH MARK-instructie bevat. Deze opgeslagen procedure moet vervolgens worden uitgevoerd op de externe server onder het bereik van de transactie op de oorspronkelijke server.

Denk bijvoorbeeld aan een gepartitioneerde database die bestaat op meerdere exemplaren van SQL Server. Op elke instantie is een database met de naam coyote. Maak eerst in elke database een opgeslagen procedure, bijvoorbeeld 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  

Maak vervolgens een opgeslagen procedure sp_MarkAll met een transactie die een markering in elke database plaatst. sp_MarkAll kan worden uitgevoerd vanuit een van de instances.

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  

doorvoeren Two-Phase

Het doorvoeren van een gedistribueerde transactie vindt plaats in twee fasen: voorbereiden en doorvoeren. Wanneer een gemarkeerde transactie wordt doorgevoerd, wordt de doorvoerlogboekrecord voor elke database in de gemarkeerde transactie in het logboek geplaatst op een moment waarop er geen twijfels zijn over transacties in een van de logboeken. Op dit moment is het gegarandeerd dat er geen transacties zijn die worden weergegeven als vastgelegd in het ene logboek, maar niet in een ander logboek worden vastgelegd.

De volgende stappen doen dit tijdens het doorvoeren van een gemarkeerde transactie:

  1. De voorbereidingsfase van een markeringstransactie pauzeert alle nieuwe voorbereidingen en vastleggingen.

  2. Alleen doorvoeringen van reeds voorbereide transacties mogen worden voortgezet.

  3. Als u transactie markeert, wacht u vervolgens tot alle voorbereide transacties leeg zijn (met time-out).

  4. Gemarkeerde transactie wordt voorbereid en doorgevoerd.

  5. De blokkering van nieuwe voorbereidingen en toezeggingen wordt verwijderd.

De stallen die worden gegenereerd door gemarkeerde transacties die meerdere databases omvatten, kunnen de prestaties van de transactieverwerking van de server verminderen.

U wordt aangeraden geen gelijktijdig gemarkeerde transacties uit te voeren. Hoewel zeldzaam, is het mogelijk dat een gedistribueerde gemarkeerde transactie in een impasse raakt met andere gedistribueerde gemarkeerde transacties die tegelijkertijd worden doorgevoerd. Als dit gebeurt, wordt de markeringstransactie als impasse-slachtoffer gekozen en teruggedraaid. Wanneer deze fout optreedt, kan de toepassing de gemarkeerde transactie opnieuw proberen. Wanneer meerdere gemarkeerde transacties gelijktijdig proberen door te voeren, is er een hogere kans op impasses.

Herstel naar een gemarkeerde transactie

Zie voor informatie over het herstellen van een database die gemarkeerde transacties bevat tot of vlak voor een specifieke markering, Herstel van gerelateerde databases met gemarkeerde transacties.

Zie ook

BEGIN GEDISTRIBUEERDE TRANSACTIE (Transact-SQL)
back-up maken en herstellen van systeemdatabases (SQL Server)
BEGIN TRANSACTIE (Transact-SQL)
Back-ups van transactielogboeken (SQL Server) toepassen
Volledige Databaseback-ups (SQL Server)
RESTORE (Transact-SQL)
Herstel van gerelateerde databases die gemarkeerde transacties- bevatten