sql >> Databáze >  >> RDS >> Sqlserver

Přečtěte si protokol transakcí SQL Server

Můžete použít sys.fn_dblog pro čtení transakčního protokolu. Příklad níže.

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

Pro delete a insert operace IIRC [RowLog Contents 0] obsahuje celý vložený a smazaný řádek. Aktualizace jsou o něco složitější v tom, že lze zaprotokolovat pouze částečný řádek.

Chcete-li dekódovat tento formát řádků, musíte pochopit, jak jsou řádky interně uloženy na serveru SQL Server. Kniha Microsoft SQL Server 2008 Internals pokrývá to do jisté míry podrobně. Můžete si také stáhnout SQL Server Internals Viewer pomoci v tomto ohledu (A věřím, že zdrojový kód pro Mark Rasmussen Orca MDF je k dispozici také, který má pravděpodobně nějaký kód pro dekódování interního formátu řádků).

Příklad, jak to udělat v TSQL, viz tento blogový příspěvek což ukazuje, že je dokonale možné extrahovat užitečné informace z protokolu, pokud je cíl projektu omezen. Psaní plnohodnotné čtečky protokolů, která by se dokázala vyrovnat se změnami schématu v objektech a věcmi, jako jsou řídké sloupce (a indexy úložiště sloupců v příští verzi), by však pravděpodobně představovalo obrovské množství práce.



  1. Najděte nejbližší odpovídající řetězce a jejich podřetězce pomocí SQL dotazu

  2. Vložit data do SQL Server 2017

  3. ODP.Net - OracleDataReader. Čtení velmi pomalé

  4. Proč je výchozí řazení MySQL latin1_swedish_ci?