Freigeben über


Verwenden von markierten Transaktionen zum konsistenten Wiederherstellen verwandter Datenbanken (vollständiges Wiederherstellungsmodell)

Dieses Thema ist nur für SQL Server-Datenbanken relevant, die die vollständigen oder massenprotokollierten Wiederherstellungsmodelle verwenden.

Wenn Sie verwandte Aktualisierungen an zwei oder mehr Datenbanken vornehmen, können Sie Transaktionsmarkierungen verwenden, um sie zu einem logisch konsistenten Punkt wiederherzustellen. Diese Wiederherstellung verliert jedoch alle Transaktionen, die nach der Markierung abgeschlossen sind, die als Wiederherstellungspunkt verwendet wurde. Das Markieren von Transaktionen eignet sich nur, wenn Sie verwandte Datenbanken testen oder wenn Sie bereit sind, kürzlich zugesicherte Transaktionen zu verlieren.

Durch das routinemäßige Markieren verwandter Transaktionen in jeder verknüpften Datenbank wird eine Reihe allgemeiner Wiederherstellungspunkte in den Datenbanken eingerichtet. Die Transaktionsmarkierungen werden im Transaktionsprotokoll aufgezeichnet und in Protokollsicherungen eingeschlossen. Im Falle eines Notfalls können Sie jede Datenbank auf demselben Transaktionszeichen wiederherstellen, um sie an einem konsistenten Punkt wiederherzustellen.

Hinweis

Protokollsicherungen in den verschiedenen Datenbanken können unabhängig voneinander erstellt werden und müssen nicht gleichzeitig sein.

Das Wiederherstellen verwandter Datenbanken in den folgenden Szenarien erfordert, dass Sie bereits Transaktionen in jeder zugehörigen Datenbank markiert haben:

  • Mindestens ein Transaktionsprotokoll wird zerstört. Sie müssen den Satz von Datenbanken zum Zeitpunkt der letzten Protokollsicherung auf einen konsistenten Zustand wiederherstellen.

  • Sie müssen den gesamten Satz von Datenbanken zu einem sich gegenseitig konsistenten Zustand zu einem früheren Zeitpunkt wiederherstellen.

Von Bedeutung

Sie können verwandte Datenbanken nur auf eine markierte Transaktion und nicht auf einen bestimmten Zeitpunkt wiederherstellen.

Informationen zum Erstellen von Markierungstransaktionen finden Sie weiter unten in diesem Thema unter "Erstellen der markierten Transaktionen".

Typisches Szenario für die Verwendung markierter Transaktionen

Ein typisches Szenario für die Verwendung markierter Transaktionen umfasst die folgenden Schritte:

  1. Erstellen Sie eine vollständige oder differenzielle Datenbanksicherung jeder der zugehörigen Datenbanken.

  2. Markieren eines Transaktionsblocks in allen Datenbanken.

  3. Sichern Sie das Transaktionsprotokoll für alle Datenbanken.

  4. Wiederherstellen von Datenbanksicherungen MIT NORECOVERY.

  5. Wiederherstellen von Protokollen MIT STOPATMARK.

Überlegungen zur Verwendung markierter Transaktionen

Bevor Sie benannte Markierungen in das Transaktionsprotokoll einfügen, beachten Sie Folgendes:

  • Da Transaktionsmarkierungen Protokollbereich beanspruchen, sollten Sie sie nur für Transaktionen verwenden, die eine wichtige Rolle in der Strategie zur Datenbankwiederherstellung spielen.

  • Wenn eine markierte Transaktion verbucht wird, wird eine Zeile in der Tabelle logmarkhistory in msdb eingefügt.

  • Wenn eine markierte Transaktion mehrere Datenbanken auf demselben Datenbankserver oder auf verschiedenen Servern umfasst, müssen die Markierungen in den Protokollen aller betroffenen Datenbanken aufgezeichnet werden.

Erstellen der markierten Transaktionen

Verwenden Sie die BEGIN TRANSACTION-Anweisung und die WITH MARK [description]-Klausel, um eine markierte Transaktion zu erstellen. Die optionale Beschreibung ist eine textbezogene Beschreibung des Zeichens. Es ist ein Markname für die Transaktion erforderlich. Ein Markname kann wiederverwendet werden. Das Transaktionsprotokoll zeichnet den Namen, die Beschreibung, die Datenbank, den Benutzer, die Informationen zu Datum und Uhrzeit sowie die Protokollsequenznummer (LSN) auf. Die Datetime-Informationen werden zusammen mit dem Marknamen verwendet, um das Zeichen eindeutig zu identifizieren.

So erstellen Sie markierte Transaktionen in einer Reihe von Datenbanken:

  1. Benennen Sie die Transaktion in der BEGIN TRAN-Anweisung, und verwenden Sie die WITH MARK-Klausel.

    Sie können die Anweisung BEGIN TRAN new_mark_name WITH MARK in einer bestehenden Transaktion verschachteln. Der Wert von new_mark_name ist der Markname für die Transaktion, auch wenn die Transaktion über einen Transaktionsnamen verfügt.

    Hinweis

    Wenn Sie einen zweiten geschachtelten BEGIN TRAN... WITH MARK Befehl ausgeben, wird diese Anweisung übersprungen, verursacht jedoch eine Warnmeldung.

  2. Führen Sie ein Update für alle Datenbanken in der Gruppe aus.

    Die Markierung für eine bestimmte Transaktion wird nur in die Transaktionsprotokolle der Serverinstanz eingefügt, in der die BEGIN TRAN...WITH MARK-Anweisung ausgeführt wird. Die Transaktionsmarke wird in das Transaktionsprotokoll jeder Datenbank eingefügt, die von der markierten Transaktion auf dieser Serverinstanz aktualisiert wird. Wenn sich die Datenbanken auf verschiedenen Serverinstanzen befinden, müssen für jede Serverinstanz identische Markierungen erstellt werden.

Beispiele

Im folgenden Beispiel wird das Transaktionsprotokoll bis zu dem markierten Punkt in der Transaktion mit dem Namen ListPriceUpdate wiederhergestellt.

USE AdventureWorks  
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 = 'ListPriceUpdate';  

Erzwingen, dass eine Markierung auf andere Server verteilt wird

Ein Transaktionszeichenname wird nicht automatisch an einen anderen Server verteilt, wenn sich die Transaktion dorthin ausbreitet. Damit die Markierung auf die anderen Server verteilt wird, muss eine gespeicherte Prozedur geschrieben werden, die eine WITH MARK-Anweisung mit BEGIN TRAN name enthält. Diese gespeicherte Prozedur muss dann auf dem Remoteserver unter dem Bereich der Transaktion auf dem Ursprungsserver ausgeführt werden.

Betrachten Sie beispielsweise eine partitionierte Datenbank, die in mehreren Instanzen von SQL Server vorhanden ist. Bei jeder Instanz handelt es sich um eine Datenbank mit dem Namen coyote. Erstellen Sie zunächst in jeder Datenbank eine gespeicherte Prozedur, sp_SetMarkz. B. .

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

Erstellen Sie als Nächstes eine gespeicherte Prozedur sp_MarkAll , die eine Transaktion enthält, die eine Markierung in jeder Datenbank platziert. sp_MarkAll kann von einer der Instanzen ausgeführt werden.

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  

commit für Two-Phase

Das Durchführen einer verteilten Transaktion erfolgt in zwei Phasen: vorbereiten und commit. Wenn eine markierte Transaktion zugesichert wird, wird der Commit-Protokolldatensatz für jede Datenbank in der markierten Transaktion zu einem Zeitpunkt aufgezeichnet, an dem keine unsicheren Transaktionen in einem der Protokolle vorhanden sind. An diesem Punkt wird sichergestellt, dass es keine Transaktionen gibt, die in einem Protokoll als zugesichert angezeigt werden, aber in einem anderen Protokoll nicht zugesichert sind.

Die folgenden Schritte führen dies während des Commits einer markierten Transaktion aus:

  1. Die Vorbereitungsphase einer Markierungstransaktion stoppt alle neuen Vorbereitungen und Commits.

  2. Nur Commits bereits vorbereiteter Transaktionen dürfen fortgesetzt werden.

  3. Das Markieren der Transaktion wartet dann auf alle vorbereiteten Transaktionen, die abgelassen werden (mit Timeout).

  4. Die markierte Transaktion wird vorbereitet und abgeschlossen.

  5. Der Stand der neuen Vorbereitungen und Commits wird entfernt.

Die durch markierte Transaktionen generierten Blockaden, die über mehrere Datenbanken hinweg auftreten, können die Leistungsfähigkeit bei der Verarbeitung von Transaktionen auf dem Server verringern.

Es wird empfohlen, dass Sie keine gleichzeitig markierten Transaktionen ausführen. Es ist selten, aber möglich, dass der Commit einer verteilten markierten Transaktion zu einem Deadlock mit anderen verteilten markierten Transaktionen führen kann, die gleichzeitig ausgeführt werden. In diesem Fall wird die markierte Transaktion als Opfer eines Deadlocks ausgewählt und zurückgesetzt. Wenn dieser Fehler auftritt, kann die Anwendung die markierte Transaktion wiederholen. Wenn mehrere markierte Transaktionen gleichzeitig versuchen, einen Commit durchzuführen, gibt es eine höhere Wahrscheinlichkeit von Deadlock.

Wiederherstellen einer markierten Transaktion

Informationen dazu, wie eine Datenbank wiederhergestellt wird, die markierte Transaktionen bis oder direkt vor einem bestimmten Markierungspunkt enthält, finden Sie unter: "Wiederherstellung verwandter Datenbanken, die markierte Transaktionen enthalten".

Siehe auch

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
Sichern und Wiederherstellen von Systemdatenbanken (SQL Server)
BEGIN TRANSACTION (Transact-SQL)
Anwenden von Transaktionsprotokollsicherungen (SQL Server)
Vollständige Datenbanksicherungen (SQL Server)
RESTORE (Transact-SQL)
Wiederherstellung verwandter Datenbanken, die eine markierte Transaktion enthalten