执行时
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读取日志的所有数据和信息?
答案 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)
要查看这些记录。
我建议尽快将这些保存在不同的数据库的表格中。然后,您可以在闲暇时仔细阅读它们,看看是否保存了任何有用的日志记录。
虽然;解码它们有多简单,无论如何都非常依赖。