Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Toto téma je relevantní pouze pro databáze SQL Serveru, které používají úplné nebo hromadně protokolované modely obnovení.
Když provedete související aktualizace dvou nebo více databází, jako jsou související databáze, můžete je pomocí značek transakcí obnovit do logicky konzistentního stavu. Toto obnovení však ztratí všechny transakce, které jsou potvrzeny po značce, která byla použita jako bod obnovení. Označení transakcí je vhodné pouze v případech, kdy testujete související databáze nebo jste ochotni ztratit nedávno potvrzené transakce.
Rutinní označení souvisejících transakcí v každé související databázi vytváří řadu běžných bodů obnovení v databázích. Značky transakcí jsou zaznamenány v transakčním protokolu a zahrnuty do záloh protokolů. V případě havárie můžete obnovit každou databázi na stejnou značku transakce, aby se obnovily do konzistentního bodu.
Poznámka
Zálohy protokolů v různých databázích je možné vytvářet nezávisle na sobě a nemusí být souběžné.
Obnovení souvisejících databází v následujících scénářích vyžaduje, abyste již označili transakce ve všech souvisejících databázích:
Jeden nebo více transakčních protokolů jsou zničeny. V době poslední zálohy protokolu musíte obnovit sadu databází do konzistentního stavu.
V určitém dřívějším bodu v čase musíte obnovit celou sadu databází do vzájemně konzistentního stavu.
Důležitý
Související databáze můžete obnovit pouze na označenou transakci, nikoli na konkrétní bod v čase.
Informace o vytváření označených transakcí naleznete v části Vytváření označených transakcí dále v tomto tématu.
Typický scénář použití označených transakcí
Typický scénář použití označených transakcí zahrnuje následující kroky:
Vytvořte úplnou nebo rozdílovou zálohu databáze pro každou související databázi.
Označte blok transakce ve všech databázích.
Zálohujte transakční protokol pro všechny databáze.
Obnovte zálohy databáze POMOCÍ NORECOVERY.
Obnovte záznamy pomocí STOPATMARK.
Důležité informace o používání označených transakcí
Před vložením pojmenovaných značek do transakčního protokolu zvažte následující:
Vzhledem k tomu, že transakční značky spotřebovávají místo v protokolu, používejte je pouze pro transakce, které hrají významnou roli ve strategii obnovení databáze.
Po potvrzení označené transakce se do tabulky logmarkhistory v databázi msdbvloží řádek.
Pokud označená transakce zahrnuje více databází na stejném databázovém serveru nebo na různých serverech, značky musí být zaznamenány v protokolech všech ovlivněných databází.
Vytvoření označených transakcí
Chcete-li vytvořit označenou transakci, použijte příkaz BEGIN TRANSACTION a klauzule WITH MARK [popis]. Volitelný popis je textový popis značky. Je vyžadován název značky transakce. Název značky lze znovu použít. Transakční protokol zaznamenává název značky, popis, databázi, uživatele, informace o datu a čase a pořadové číslo protokolu (LSN). Informace o datu a čase se používají spolu s názvem značky k jedinečné identifikaci značky.
Vytvoření označených transakcí v sadě databází:
Pojmenujte transakci v příkazu BEGIN TRAN a použijte klauzuli WITH MARK.
Můžete vložit příkaz BEGIN TRAN new_mark_name WITH MARK do existující transakce. Hodnota new_mark_name je název značky pro transakci, i v případě, že transakce má svůj vlastní název.
Poznámka
Pokud vydáte druhý vnořený BEGIN TRAN... WITH MARK, tento příkaz se přeskočí, ale způsobí varovnou zprávu.
Spusťte aktualizaci pro všechny databáze v sadě.
Značka pro konkrétní transakci je vložena do transakčních protokolů pouze na instanci serveru, kde je proveden příkaz BEGIN TRAN...WITH MARK. Značka transakce je umístěna v transakčním protokolu každé databáze aktualizované označenou transakcí v této instanci serveru. Pokud se databáze nacházejí v různých instancích serveru, musí být na každé instanci serveru vytvořeny stejné značky.
Příklady
Následující příklad obnovuje transakční protokol podle značky v transakci označené názvem 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';
Vynucení šíření značky na jiné servery
Název značky transakce není automaticky distribuován na jiný server, protože transakce se tam šíří. Chcete-li donutit značku se rozšířit na ostatní servery, je třeba napsat uloženou proceduru, která obsahuje příkaz BEGIN TRAN s MARK. Tato uložená procedura se pak musí spustit na vzdáleném serveru v rámci transakce na původním serveru.
Představte si například dělenou databázi, která existuje na více instancích SQL Serveru. V každé instanci je databáze s názvem coyote
. Nejprve v každé databázi vytvořte uloženou proceduru, například 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
Dále vytvořte uloženou proceduru sp_MarkAll
obsahující transakci, která umístí značku do každé databáze.
sp_MarkAll
lze spustit z libovolné instance.
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
potvrzení Two-Phase
Potvrzení distribuované transakce probíhá ve dvou fázích: příprava a potvrzení. Pokud je potvrzena označená transakce, záznam zápisu do protokolu pro každou databázi v označené transakci je umístěn do protokolu v okamžiku, kdy neexistují žádné nerozhodnuté transakce v žádném z protokolů. V tomto okamžiku je zaručeno, že neexistují žádné transakce, které se zobrazují jako potvrzené v jednom protokolu, ale nejsou potvrzeny v jiném protokolu.
Následující kroky to provede během potvrzení označené transakce:
Přípravná fáze označovací transakce přeruší všechny nové přípravy a potvrzení.
Pokračovat mohou pouze potvrzení již připravených transakcí.
Označení transakce pak čeká na vyprázdnění všech připravených transakcí (s vypršením časového limitu).
Označená transakce je připravena a potvrzena.
Odstranění zpoždění nových příprav a úkonů je dokončeno.
Zpoždění způsobená transakcemi označenými, které pokrývají více databází, mohou snížit výkon serveru při zpracování transakcí.
Doporučujeme nespouštět souběžné označené transakce. Je vzácné, ale možné, že při potvrzování distribuované označené transakce dojde k zablokování s jinými distribuovanými označenými transakcemi, které se potvrzují ve stejnou dobu. V takovém případě je transakce označení zvolena jako oběť vzájemného zablokování a je vrácena zpět. Pokud dojde k této chybě, aplikace může zkusit označenou transakci zopakovat. Pokud se několik označených transakcí pokusí potvrdit souběžně, existuje vyšší pravděpodobnost zablokování.
Obnovení na označenou transakci
Informace o tom, jak obnovit databázi, která obsahuje označené transakce nebo těsně před konkrétní značkou, naleznete v tématu Obnovení souvisejících databází, které obsahují označené transakce.
Viz také
BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
zálohování a obnovení systémových databází (SQL Server)
ZAČÍT TRANSAKCI (Transact-SQL)
Použít zálohy transakčních protokolů (SQL Server)
Úplné zálohy databáze (SQL Server)
OBNOVIT (Transact-SQL)
obnovení souvisejících databází, které obsahují označené transakce