Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Lesen Sie das SQL Server-Transaktionsprotokoll

Sie können sys.fn_dblog verwenden um das Transaktionsprotokoll zu lesen. Beispiel unten.

SELECT [RowLog Contents 0],
       [RowLog Contents 1],
       [Current LSN],
       Operation,
       Context,
       [Transaction ID],
       AllocUnitId,
       AllocUnitName,
       [Page ID],
       [Slot ID]
FROM sys.fn_dblog(NULL,NULL)
WHERE Context IN ('LCX_MARK_AS_GHOST', 'LCX_HEAP', 'LCX_CLUSTERED') 
AND Operation IN ('LOP_DELETE_ROWS', 'LOP_INSERT_ROWS') 

Für ein delete und insert operation IIRC the [RowLog Contents 0] enthält die gesamte eingefügte und gelöschte Zeile. Aktualisierungen sind etwas komplizierter, da nur eine Teilzeile protokolliert werden kann.

Um dieses Zeilenformat zu decodieren, müssen Sie verstehen, wie Zeilen intern in SQL Server gespeichert werden. Das Buch Microsoft SQL Server 2008 Internals behandelt dies etwas ausführlicher. Sie können auch den SQL Server Internals Viewer herunterladen um in dieser Hinsicht zu helfen (Und ich glaube, der Quellcode für Mark Rasmussen 's Orca MDF ist ebenfalls verfügbar, der vermutlich Code enthält, um das interne Zeilenformat zu decodieren).

Ein Beispiel dafür in TSQL finden Sie unter dieser Blogbeitrag was zeigt, dass es durchaus möglich ist, nützliche Informationen aus dem Protokoll zu extrahieren, solange das Ziel des Projekts begrenzt ist. Das Schreiben eines vollständigen Protokolllesers, der mit Schemaänderungen in den Objekten und Dingen wie Sparse-Spalten (und Spaltenspeicherindizes in der nächsten Version) fertig werden könnte, wäre jedoch wahrscheinlich eine große Menge an Arbeit.