Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przeczytaj dziennik transakcji SQL Server

Możesz użyć sys.fn_dblog czytać dziennik transakcji. Przykład poniżej.

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

Dla delete i insert operacja IIRC [RowLog Contents 0] zawiera cały wstawiony i usunięty wiersz. Aktualizacje są nieco bardziej skomplikowane, ponieważ można zarejestrować tylko częściowy wiersz.

Aby zdekodować ten format wiersza, musisz zrozumieć, w jaki sposób wiersze są przechowywane wewnętrznie w SQL Server. Książka Microsoft SQL Server 2008 Internals omówi to szczegółowo. Możesz też pobrać Przeglądarka danych wewnętrznych serwera SQL aby pomóc w tym zakresie (I wierzę, że kod źródłowy Mark Rasmussen Orka MDF jest również dostępny, który prawdopodobnie zawiera kod do dekodowania wewnętrznego formatu wiersza).

Aby zapoznać się z przykładem wykonania tego w TSQL, zobacz ten post na blogu co pokazuje, że uzyskanie przydatnych informacji z dziennika jest jak najbardziej możliwe, o ile cel projektu jest ograniczony. Napisanie pełnowymiarowego czytnika dzienników, który poradzi sobie ze zmianami schematu w obiektach i rzeczami, takimi jak rzadkie kolumny (i indeksy magazynu kolumn w następnej wersji), prawdopodobnie wymagałoby ogromnej pracy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykonaj regex (zamień) w zapytaniu SQL

  2. Grupy konwersacyjne dla brokerów usług SQL Server

  3. SQL - Jak przechowywać i nawigować w hierarchiach?

  4. Przywracanie bazy danych SQL Server (T-SQL)

  5. Jak uzyskać informacje o dacie/godzinie z kolumny TIMESTAMP?