sys.fn_dblog的开始和结束LSN参数应该采用什么格式?

时间:2013-12-27 13:11:44

标签: sql sql-server sql-server-2008

执行时

SELECT [Current LSN]
FROM sys.fn_dblog(NULL,NULL)

LSN值以

格式显示
'000000CB:00000055:0002'

然而,当我尝试以该格式明确地将开始和结束LSN参数传递给fn_dblog

SELECT *
FROM   sys.fn_dblog('000000CB:00000055:0002', '000000CC:00000088:000A') 

我收到错误,说...

  

消息9005,级别16,状态3,行1启动LSN或结束LSN   在OpenRowset(DBLog,...)中指定的内容无效。

为什么这不起作用,他们需要采用什么格式?


我根据这个关于LSN和日志文件的site进行了一些研究......但是,或者我得到了一个错误,或者,当我用两个参数执行命令时,我只获得了2行信息...我认为这很有意义,因为当我使用程序读取数据日志时,我得到了所有信息。

如何使用SQL读取日志的所有数据和信息?

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:5)

仅供参考:从SQL Server 12开始(我还没有测试过其他人,但是看起来就像SQL 2000一样),你可以添加' 0x'到LSN文本的开头。

SELECT TOP 1 [Current LSN] FROM fn_dblog('0x000000CB:00000055:0002',null)

显然,如果查询返回时没有错误且结果中的LSN相同,那么你应该好好去。

归功于Art of SQL

答案 1 :(得分:4)

您的问题中有几个问题。

首先,关于LSN格式的问题,您需要将十六进制数转换为十进制数,以获得预期的参数格式。

转换000000CC:00000088:000A的示例代码是

DECLARE @LSN_HEX_SEP NVARCHAR(23) = '000000CC:00000088:000A'

DECLARE @N1 BIGINT = CONVERT(varbinary,SUBSTRING(@LSN_HEX_SEP, 1, 8),2),
        @N2 BIGINT = CONVERT(varbinary,SUBSTRING(@LSN_HEX_SEP, 10, 8),2),
        @N3 BIGINT = CONVERT(varbinary,SUBSTRING(@LSN_HEX_SEP, 19, 4),2)

SELECT CAST(@N1 AS VARCHAR) + ':' +
      CAST(@N2 AS VARCHAR) + ':' +
      CAST(@N3 AS VARCHAR)

所以转换后的调用看起来像

Select * 
from sys.fn_dblog('203:85:2', '204:136:10')

但这不会对您有所帮助

运行后显示的屏幕截图

SELECT *
FROM sys.fn_dblog(NULL,NULL)

显示您的活动日志只包含两行,并且它们不在您尝试查找的LSN范围内。

将参数传递给函数只会过滤这些行。它不会向您显示任何其他的(并且您将收到日志扫描错误,寻找不存在的错误)。

相关日志记录可能已经丢失。跟踪标志2357可用于显示非活动日志中的记录。

您可以使用

DBCC TRACEON(2537)

SELECT *
FROM sys.fn_dblog(NULL,NULL)

要查看这些记录。

我建议尽快将这些保存在不同的数据库的表格中。然后,您可以在闲暇时仔细阅读它们,看看是否保存了任何有用的日志记录。

虽然;解码它们有多简单,无论如何都非常依赖。