当我执行

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

LSN值以以下格式表示
'000000CB:00000055:0002'

但是,当我尝试以这种格式将start和end LSN参数明确传递给fn_dblog
SELECT *
FROM   sys.fn_dblog('000000CB:00000055:0002', '000000CC:00000088:000A')

我说错了...

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

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

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

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

最佳答案

您的问题有两个问题。

首先,关于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)

查看那些记录。

我建议尽快将它们保存在其他数据库的表中。然后,您可以悠闲地阅读它们,以查看是否保存了任何有用的日志记录。

虽然;无论如何,解码它们的难易程度在很大程度上取决于。

10-08 20:20