sql >> Database >  >> RDS >> Sqlserver

SQL Server-transactielogboek lezen

U kunt sys.fn_dblog . gebruiken om het transactielogboek te lezen. Voorbeeld hieronder.

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') 

Voor een delete en insert operatie IIRC de [RowLog Contents 0] bevat de hele rij die is ingevoegd en verwijderd. Updates zijn een beetje ingewikkelder omdat er slechts een gedeeltelijke rij kan worden gelogd.

Om deze rij-indeling te decoderen, moet u begrijpen hoe rijen intern in SQL Server worden opgeslagen. Het boek Microsoft SQL Server 2008 Internals behandelt dit in enig detail. U kunt ook de SQL Server Internals Viewer downloaden om in dit opzicht te helpen (en ik geloof dat de broncode voor Mark Rasmussen 's Orca MDF is ook beschikbaar die vermoedelijk enige code heeft om het interne rijformaat te decoderen).

Voor een voorbeeld om dit in TSQL te doen, zie deze blogpost waaruit blijkt dat het prima mogelijk is om bruikbare informatie uit het logboek te halen zolang het doel van het project beperkt is. Het schrijven van een volwaardige loglezer die schemawijzigingen in de objecten en zaken als schaarse kolommen (en kolomopslagindexen in de volgende versie) aankan, zou echter waarschijnlijk een enorme hoeveelheid werk zijn.



  1. Hoe bekijk ik alle metagegevens van kolommen van een tabel in de Oracle-database?

  2. mysql-volgorde op max komt overeen met veldwaarde

  3. hoe java-datumtype op te slaan in mysql-datumtype?

  4. MySql draagbare versie