sql-server-2008 - 读取 SQL Server 事务日志

标签 sql-server-2008 sql-server-2005

我们如何读取 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 RasmussenOrca MDF 的源代码也可用,其中可能有一些代码来解码内部行格式)。

有关在 TSQL 中执行此操作的示例,请参阅 this blog post这表明只要项目的目标有限,就完全有可能从日志中提取有用的信息。编写一个完整的日志读取器来应对对象中的架构更改以及稀疏列(以及下一版本中的列存储索引)等内容可能会是一项巨大的工作量。

关于sql-server-2008 - 读取 SQL Server 事务日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9014531/

相关文章:

sql-server - 如何同步 SQL Server 数据库的两个(或 n 个)复制进程?

c# - Entity Framework 4 : Bad performance with SQL Server 2008

sql - 索引 View 在没有索引的情况下编写脚本

asp.net - 如何创建/使用 MembershipProvider?

sql - 完善使用BULK INSERT查询

sql - 在 SQL Server 中将一个表连接到两个一对多关系表

sql-server-2008 - 我应该提交还是回滚创建临时表、读取然后删除它的事务?

sql-server - 是否可以在 SQL Server 中强制行级锁定?

sql-server - 检索查询中的最新记录

sql-server-2005 - SQL Server 报告服务 : creating a Pareto chart