Dela via


Använd markerade transaktioner för att återställa relaterade databaser konsekvent

gäller för:SQL Server

Det här avsnittet är endast relevant för SQL Server-databaser som använder de fullständiga eller massloggade återställningsmodellerna.

När du gör relaterade uppdateringar av två eller flera databaser, relaterade databaser, kan du använda transaktionsmarkeringar för att återställa dem till ett logiskt sammanhängande tillstånd. Den här återställningen förlorar dock alla transaktioner som har slutförts efter det märke som användes som återställningspunkt. Att markera transaktioner är endast lämpligt när du testar relaterade databaser eller när du är villig att förlora nyligen genomförda transaktioner.

Genom att rutinmässigt markera relaterade transaktioner i varje relaterad databas upprättas en serie vanliga återställningspunkter i databaserna. Transaktionsmärkena registreras i transaktionsloggen och ingår i loggsäkerhetskopior. I händelse av en katastrof kan du återställa var och en av databaserna till samma transaktionsmärke för att återställa dem till en konsekvent punkt.

Not

Loggsäkerhetskopior på de olika databaserna kan skapas oberoende av varandra och behöver inte vara samtidiga.

Återställning av relaterade databaser i följande scenarier kräver att du redan har markerat transaktioner i varje relaterad databas:

  • En eller flera transaktionsloggar förstörs. Du måste återställa uppsättningen databaser till ett konsekvent tillstånd vid tidpunkten för den senaste loggsäkerhetskopian.

  • Du måste återställa hela uppsättningen databaser till ett ömsesidigt konsekvent tillstånd någon gång tidigare.

Viktig

Du kan bara återställa relaterade databaser till en markerad transaktion, inte till en viss tidpunkt.

Mer information om hur du skapar markeringstransaktioner finns i "Skapa markerade transaktioner" senare i det här avsnittet.

Typiskt scenario för att använda markerade transaktioner

Ett typiskt scenario för att använda markerade transaktioner innehåller följande steg:

  1. Skapa en fullständig eller differentiell databassäkerhetskopia av var och en av de relaterade databaserna.

  2. Markera ett transaktionsblock i alla databaser.

  3. Säkerhetskopiera transaktionsloggen för alla databaser.

  4. Återställa databassäkerhetskopior MED NORECOVERY.

  5. Återställ loggar MED STOPATMARK.

Överväganden för att använda markerade transaktioner

Tänk på följande innan du infogar namngivna märken i transaktionsloggen:

  • Eftersom transaktionsmärken förbrukar loggutrymme använder du dem endast för transaktioner som spelar en viktig roll i strategin för databasåterställning.

  • När en markerad transaktion begås läggs till en rad i tabellen logmarkhistory i msdb.

  • Om en markerad transaktion sträcker sig över flera databaser på samma databasserver eller på olika servrar måste märkena registreras i loggarna för alla berörda databaser.

Skapa markerade transaktioner

Om du vill skapa en markerad transaktion använder du instruktionen BEGIN TRANSACTION och satsen WITH MARK [description] . Den valfria beskrivningen är en textbeskrivning av märket. Ett märkesnamn för transaktionen krävs. Ett märkesnamn kan återanvändas. Transaktionsloggen registrerar markeringens namn, beskrivning, databas, användare, datetime-information och loggsekvensnumret (LSN). Datetime-informationen används tillsammans med marknamnet för att unikt identifiera märket.

Skapa markerade transaktioner i en uppsättning databaser:

  1. Namnge transaktionen i BEGIN TRAN-instruktionen och använd WITH MARK-satsen

    Du kan kapsla instruktionen BEGIN TRAN new_mark_name WITH MARK inom en befintlig transaktion. Värdet för new_mark_name är namnet på transaktionen, även om transaktionen har ett transaktionsnamn.

    Not

    Om du utfärdar en andra kapslad BEGIN TRAN... MED MARK hoppas instruktionen över men orsakar ett varningsmeddelande.

  2. Kör en uppdatering mot alla databaser i uppsättningen.

    Märket för en specifik transaktion infogas endast i transaktionsloggar på serverinstansen där BEGIN TRAN... WITH MARK-instruktionen körs. Transaktionsmärket placeras i transaktionsloggen för varje databas som uppdateras av den markerade transaktionen på den serverinstansen. Om databaserna finns på olika serverinstanser måste identiska märken skapas på var och en av serverinstanserna.

Exempel

Följande exempel återställer transaktionsloggen till märket i den transaktion som är markerad med namnet 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';  

Tvinga ett märke att spridas till andra servrar

Ett transaktionsmärkesnamn distribueras inte automatiskt till en annan server eftersom transaktionen sprids där. Om du vill tvinga märket att spridas till de andra servrarna måste en lagrad procedur skrivas som innehåller ett BEGIN TRAN-namn WITH MARK-instruktion. Den lagrade proceduren måste sedan köras på fjärrservern under transaktionens omfång på den ursprungliga servern.

Tänk dig till exempel en partitionerad databas som finns på flera instanser av SQL Server. På varje instans finns en databas med namnet coyote. Börja med att skapa en lagrad procedur i varje databas, till exempel 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  

Skapa sedan en lagrad procedur sp_MarkAll som innehåller en transaktion som placerar ett märke i varje databas. sp_MarkAll kan köras från vilken som helst av instanserna.

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  

Two-Phase Commit

Att genomföra en distribuerad transaktion sker i två faser: förbereda och genomföra. När en markerad transaktion bekräftas placeras bekräftelseloggposten för varje databas i den markerade transaktionen i loggen vid en punkt där det inte finns några tveksamma transaktioner i någon av deras loggar. I det här läget är det garanterat att det inte finns några transaktioner som visas som incheckade i en logg, men som inte har checkats in i en annan logg.

Följande steg utför detta under incheckningen av en markerad transaktion:

  1. Förberedelsefasen i en markeringstransaktion stoppar alla nya förberedelser och bekräftelser.

  2. Endast committeringar av redan förberedda transaktioner får fortsätta.

  3. Att markera transaktionen innebär sedan att vänta på att alla förberedda transaktioner fasas ut (med tidsgräns).

  4. Markerad transaktion har förberetts och bekräftats.

  5. Båset med nya förberedelser och incheckningar tas bort.

Fördröjningar som orsakas av markerade transaktioner som sträcker sig över flera databaser kan minska serverns prestanda för transaktionsbehandling.

Vi rekommenderar att du inte kör samtidiga markerade transaktioner. Det är ovanligt men möjligt att genomförandet av en distribuerad markerad transaktion kan skapa ett dödläge med andra distribuerade markerade transaktioner som genomförs samtidigt. När detta händer väljs markeringstransaktionen som ett dödlägesoffer och återställs. När det här felet inträffar kan programmet försöka igen med den markerade transaktionen. När flera markerade transaktioner försöker begå samtidigt finns det en högre sannolikhet för dödläge.

Återgå till en markerad transaktion

Information om hur du återställer en databas som innehåller markerade transaktioner till eller strax före ett visst märke finns i Återställning av relaterade databaser som innehåller markerad transaktion.

Se även

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
säkerhetskopiering och återställning av systemdatabaser (SQL Server)
BÖRJA TRANSAKTION (Transact-SQL)
Tillämpa säkerhetskopieringar av transaktionsloggar (SQL Server)
Fullständiga databassäkerhetskopior (SQL Server)
RESTORE (Transact-SQL)
återställning av relaterade databaser som innehåller markerad transaktion