Markierte Transaktionen – Auf die Transaktion genaues zurückrollen!

Bei größeren Transakionen bietet es sich an, zu wissen wann und welche Aktion die Änderung in der Datenbank verursacht hat, um bei einem Restore der Datenbank mit entsprechenden Transaktions-Protokoll Sicherungen auch wieder auf genau diesen Zeitpunkt zurücksichern zu können. Besser als sich die Zeit zu notieren, ist es beim Ausführen einer Transaktion diese zu markieren. Dafür erhält die Transaktion einen Namen und kann dann bei einem Restore mit einem Haltepunkt angesteuert werden.

Hier das Beispiel:

  1. Zuerst brauchen wir wieder eine Datenbank mit Daten:
CREATE DATABASE markedtran
GO
USE markedtran
GO
CREATE TABLE dbo.test (id int not null primary key, test varchar(255) null);
go
insert into test (id, test) values (1, 'a');
insert into test (id, test) values (2, 'b');
insert into test (id, test) values (3, 'c');
insert into test (id, test) values (4, 'd');
insert into test (id, test) values (5, 'e');
GO
  • Danach sichern wir diese mit einer Vollsicherung, fügen erneut einen Datensatz ein (damit eine Änderung erfolgt) und sichern danach diese Änderung mit einer Transaktionslog Sicherung:
BACKUP DATABASE [markedtran] TO  DISK = N'C:\temp\markedtran.bak' WITH FORMAT, INIT,  NAME = N'markedtran-Vollständig Datenbank Sichern', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
INSERT INTO dbo.Test (id, test) VALUES(6, 'f');
GO
BACKUP LOG [markedtran] TO  DISK = N'C:\temp\markedtran.bak' WITH NOFORMAT, NOINIT,  NAME = N'markedtran-Transaktionsprotokoll  Sichern', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
  • Nun starten wir eine Transaktion, benennen diese, Aktualisieren entsprechene Datensätze mit einem Update und bestätigen diese Transaktion:
BEGIN TRANSACTION HierBinIch
WITH MARK 'Beginne die große Aktualisierung';
GO
UPDATE dbo.test SET test = 'd' WHERE id < 6
GO
COMMIT TRANSACTION HierBinIch
GO
  • Nun fügen wir nochmals einen Datensatz ein (nur um zu sehen, das nach einem Restore mit der nachfolgenden Transaktionslogsicherung dieser Datensatz dann nicht verfügbar ist, wenn nur bis zum markierten Punkt zurückgesichert wurde:
insert into test (id, test) values (9, 'z');
BACKUP LOG [markedtran] TO  DISK = N'C:\temp\markedtran.bak' WITH NOFORMAT, NOINIT,  NAME = N'markedtran-Transaktionsprotokoll  Sichern', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
  • Nun sichern wir die Vollsicherung zurück mit den beiden Transaktionslogsicherungen im Anschluss. Dabei wird dann der markierte Punkt als “Breakpoint” angegeben:
RESTORE DATABASE [markedtran] FROM  DISK = N'C:\temp\markedtran.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 10
GO
RESTORE LOG [markedtran] FROM  DISK = N'C:\temp\markedtran.bak' WITH  FILE = 2, NORECOVERY, NOUNLOAD,  STATS = 10
GO
RESTORE LOG [markedtran] FROM  DISK = N'C:\temp\markedtran.bak' WITH  FILE = 3,  NOUNLOAD,  STATS = 10,  STOPBEFOREMARK = N'HierBinIch'
GO

Das war’s!

Hinterlasse eine Antwort