当我执行
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)
查看那些记录。
我建议尽快将它们保存在其他数据库的表中。然后,您可以悠闲地阅读它们,以查看是否保存了任何有用的日志记录。
虽然;无论如何,解码它们的难易程度在很大程度上取决于。