我们如何读取 SQL Server 事务日志,我知道使用 DBCC 日志(数据库,4),它会生成日志输出,现在我想解码十六进制格式的日志记录。
0x00003E001C000000A500000001000200BE040000000006021D0000000100000018000000(仅部分数据)
有什么方法可以以文本格式读取它或将十六进制数据转换为文本。我想制作一个可以读取日志的工具。可以使用第三方工具,即 ApexSQL,但它们是付费工具。
最佳答案
您可以使用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')
对于删除
和插入
操作IIRC,[RowLog Contents 0]
包含插入和删除的整行。更新有点复杂,因为只能记录部分行。
要解码此行格式,您需要了解行在 SQL Server 内部的存储方式。本书Microsoft SQL Server 2008 Internals对此进行了一些详细介绍。您还可以下载SQL Server Internals Viewer在这方面提供帮助(我相信 Mark Rasmussen 的 Orca MDF 的源代码也可用,其中可能有一些代码来解码内部行格式)。
有关在 TSQL 中执行此操作的示例,请参阅 this blog post这表明只要项目的目标有限,就完全有可能从日志中提取有用的信息。编写一个完整的日志读取器来应对对象中的架构更改以及稀疏列(以及下一版本中的列存储索引)等内容可能会是一项巨大的工作量。
关于sql-server-2008 - 读取 SQL Server 事务日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9014531/