Part1中我们提到可以用fn_dblog查看Active的Log,但是如果Log被备份以后我们还可以查看吗?
答案是可以的,使用fn_dump_dblog。
下面是我自己做的测试:
1. --insert data to table
INSERT INTO ProdTable2DEFAULTVALUES;
GO 1000
2. ---查询Log信息
select * from fn_dblog(null,null)whereOperation='LOP_INSERT_ROWS'
查到100条记录。
3. --备份Log
backup log FNDBLogTesttodisk='d:\mssql\FNDBLogTest.trn'
4. ---查询Log信息
select * from fn_dblog(null,null)whereOperation='LOP_INSERT_ROWS'
(0 row(s) affected)
可以看到Log已经被备份了,没有Active的Log存在,所以fn_dblog没有返回任何信息。
我们用下面的语句在查一下:
5. –从备份Log查询:
SELECT * FROMfn_dump_dblog(
NULL, NULL,'DISK', 1,'d:\mssql\FNDBLogTest.trn',
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT)
whereOperation ='LOP_INSERT_ROWS'
GO
查询结果显示1000记录:
比对一下查询结果跟日志备份前fn_dblog的查询结果相同。
注意:需要指定63个默认NULL参数,否则无法返回数据。前5个参数含义如下:
1. 开始LSN
2. 结束LSN
3. 备份文件类型(disk或者Type)
4. 备份文件顺序号(假设多个备份到同一个文件)
5. 备份文件名
更详细的信息可以参考Paul在SQLSkill上的文章(Using fn_dblog, fn_dump_dblog, and restoring with STOPBEFOREMARK to an LSN)