2012-01-26 60 views
8

我们如何读取SQL Server事务日志,我知道使用DBCC日志(数据库,4),它会生成日志输出,现在我想解码为十六进制格式的日志记录。阅读SQL Server事务日志

0x00003E001C000000A500000001000200BE040000000006021D0000000100000018000000(仅数据的一部分)

有没有读它以文本格式或text.i想使一个工具,可以阅读logs.third第三方工具都可以转换为十六进制数据的方法即ApexSQL,但他们是付费工具。

+0

到底该怎么做? –

+0

可能重复的[SQL Server事务日志浏览器/分析器](http://stackoverflow.com/questions/3789443/sql-server-transaction-log-explorer-analyzer) –

回答

11

您可以使用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') 

对于deleteinsert操作IIRC的[RowLog Contents 0]包含整行插入和删除。更新稍微复杂一点,只有部分行可以被记录。

要解码此行格式,您需要了解行如何在SQL Server内部存储。本书Microsoft SQL Server 2008 Internals详细介绍了这一点。您也可以下载SQL Server Internals Viewer来获得这方面的帮助(我相信Mark RasmussenOrca MDF的源代码也可用,这可能有一些代码来解码内部行格式)。

有关在TSQL中执行此操作的示例,请参阅this blog post,该示例说明只要项目的目标有限,从日志中提取有用信息是完全可能的。编写一个完整的日志读取器,可以处理对象中的模式更改以及诸如稀疏列(以及下一版本中的列存储索引)之类的内容,但可能需要大量的工作。

0

我无法理解您的需求,但您日志中的数据可以通过Lumigent LogExplorer等工具提取。我不知道还有另一种方法去做你想做的事。

1
Select * 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') 

使用上述query..where日志记录列你得到与交易有关的所有信息会显示您的实际记录是十六进制格式..

检查此链接,让您的数据转化为人类可读的格式。 check here

+0

轻松解决此问题的最佳解决方案。为我节省了几百行。 –

+1

@MagicLasso - 它包含与我三个月前发布的完全相同的链接和基本相同的代码。 –

2

有几种SQL Server函数和命令(例如fn_dblog,fn_dump_dblog和DBCC PAGE)可能提供查看LDF文件内容的方法。然而,需要使用T-SQL的重要知识才能使用它们,有些还没有记录,并且它们提供的结果很难转换为可读的格式。以下是使用SQL Server的功能和命令查看LDF文件内容的例子:

1 - 下面是一个使用fn_dblog阅读网上交易日志,以129列(仅7所示)

的结果的一个例子

enter image description here

2 - fn_dump_dblog函数用于读取事务日志本机压缩备份或本地压缩备份。结果是相似的:

enter image description here

不幸的是,没有官方的文档可供fn_dblog和fn_dump_dblog功能。要翻译列,您需要熟悉内部结构和数据格式,标记及其在连续数据中的总数。012 - DB3 - DBCC PAGE用于读取数据库联机文件的内容 - MDF和LDF。其结果是一个十六进制输出,除非你有一个十六进制编辑器,将难以解释

enter image description here

0

步骤1. CREATE TABLE#十六进位( [hex_Value] VARBINARY NULL )

步骤2. 将数据插入表中,实施例 插入#十六进位值(0x300008000F000000030000020015001B00536976754D79736F7265)

步骤3. SELECT LTRIM(RTRIM(CONVERT(VARCHAR(最大值),REPLACE(hex_Value,为0x00,0x20的)))) FROM#十六进位

For more Information go through this link