Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
Erstellen Sie eine vollständige oder differenzielle Datenbanksicherung jeder der zugehörigen Datenbanken.
Markieren eines Transaktionsblocks in allen Datenbanken.
Sichern Sie das Transaktionsprotokoll für alle Datenbanken.
Wiederherstellen von Datenbanksicherungen MIT NORECOVERY.
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:
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.
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:
Die Vorbereitungsphase einer Markierungstransaktion stoppt alle neuen Vorbereitungen und Commits.
Nur Commits bereits vorbereiteter Transaktionen dürfen fortgesetzt werden.
Das Markieren der Transaktion wartet dann auf alle vorbereiteten Transaktionen, die abgelassen werden (mit Timeout).
Die markierte Transaktion wird vorbereitet und abgeschlossen.
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