sql >> Databasteknik >  >> RDS >> Sqlserver

Läs SQL Server transaktionslogg

Du kan använda sys.fn_dblog för att läsa transaktionsloggen. Exempel nedan.

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 en delete och insert operation IIRC [RowLog Contents 0] innehåller hela raden infogat och raderat. Uppdateringar är lite mer komplicerade eftersom endast en delrad kan loggas.

För att avkoda detta radformat måste du förstå hur rader lagras internt i SQL Server. Boken Microsoft SQL Server 2008 Internals a> täcker detta i detalj. Du kan också ladda ner SQL Server Internals Viewer för att hjälpa till i detta avseende (Och jag tror att källkoden för Mark Rasmussen s Orca MDF finns också tillgänglig som förmodligen har någon kod för att avkoda det interna radformatet).

För ett exempel på hur du gör detta i TSQL, se det här blogginlägget vilket visar att det är fullt möjligt att extrahera användbar information från loggen så länge syftet med projektet är begränsat. Att skriva en komplett loggläsare som kan hantera schemaändringar i objekten och saker som glesa kolumner (och kolumnbutiksindex i nästa version) skulle dock troligen vara en enorm mängd arbete.



  1. Oracle SQL-sats i java

  2. Hur kan jag använda en PostgreSQL-utlösare för att lagra ändringar (SQL-satser och radändringar)

  3. Hur skickar man en lista med ID:n till MySQL lagrad procedur?

  4. Oracle SQL Insert Trigger to Hash Password fungerar inte (problem med CHAR)