Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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:
Skapa en fullständig eller differentiell databassäkerhetskopia av var och en av de relaterade databaserna.
Markera ett transaktionsblock i alla databaser.
Säkerhetskopiera transaktionsloggen för alla databaser.
Återställa databassäkerhetskopior MED NORECOVERY.
Å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:
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.
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:
Förberedelsefasen i en markeringstransaktion stoppar alla nya förberedelser och bekräftelser.
Endast committeringar av redan förberedda transaktioner får fortsätta.
Att markera transaktionen innebär sedan att vänta på att alla förberedda transaktioner fasas ut (med tidsgräns).
Markerad transaktion har förberetts och bekräftats.
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