sql >> データベース >  >> RDS >> Sqlserver

SQLServerトランザクションログの読み取り

    sys.fn_dblogを使用できます トランザクションログを読み取ります。以下の例。

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

    deleteの場合 およびinsert 操作IIRC[RowLog Contents 0] 挿入および削除された行全体が含まれます。更新は、一部の行のみをログに記録できるという点で、もう少し複雑です。

    この行形式をデコードするには、行がSQ​​LServerの内部にどのように格納されているかを理解する必要があります。本 Microsoft SQL Server 2008 Internals これについて詳しく説明します。 SQLServer内部ビューアー をダウンロードすることもできます。 この点で役立つように(そして私は MarkRasmussen のソースコードを信じています の Orca MDF おそらく内部行フォーマットをデコードするためのコードが含まれている可能性もあります。

    TSQLでこれを行う例については、このブログ投稿 これは、プロジェクトの目的が限定されている限り、ログから有用な情報を抽出することが完全に可能であることを示しています。ただし、オブジェクトのスキーマ変更やスパース列(および次のバージョンの列ストアインデックス)などに対処できる本格的なログリーダーを作成することは、膨大な量の作業になる可能性があります。



    1. MySQL-NULLセーフNOT等しい演算子

    2. T-SQLを使用してSQLServerエージェントスケジュールを作成する

    3. MySQL PHP count(*)が何か奇妙なものを返す

    4. 一致するレコードがない場合にNULLを含む2つの列のすべての組み合わせを取得するMySqlクエリ