使用fn_dblog函数查看事务日志和恢复数据
基本语法
SqlServer中有一个未在文档中公开的函数sys.fn_dblog,提供查询当前数据库事务日志的功能。通过这个函数,可以简单了解下数据库事务日志的机制
使用方法如下:
select * from sys.fn_dblog(null,null)
它有两个参数,分别是起始LSN和结尾LSN(Log Sequence Number),返回结果是两个LSN之间的日志。LSN值可以不指定,使用null作为参数,则是查询所有的日志。
两个参数,不能直接使用查询出来Current LSN值,否则会报“传递给 OpenRowset(DBLog, ...)的参数无效”错误,或者参数不起作用。
使用方法:
select * from fn_dblog('0x00000041:00000320:0003',null) --LSN前面加0x
select * from fn_dblog(null,'65:800:3') --转换成十进制形式
select * from fn_dblog(null,'65000000080000003')--LSN的另一种写法
记录内容
通过一些具体操作查看日志记录情况
在一个数据库中查询事务日志条数,共90条:

向其中一个表中插入一条数据:

查询fn_dblog,记录条数变成了93条,增加了3条,分别是事务开始(LOP_BEGIN_XACT)、插入数据(LOP_INSERT_ROWS)、事务提交(LOP_COMMIT_XACT)

同理,修改数据:
update tbl set value='hhhhh' where id=6
再查询日志,增加了三条:事务开始日志(LOP_BEGIN_XACT)、修改日志(LOP_MODIFY_ROW)、事务提交日志(LOP_COMMIT_XACT)

类似的,执行删除:
delete from tbl where id=6
日志增加了3条:事务开始日志(LOP_BEGIN_XACT)、修改日志(LOP_DELETE_ROWS)、事务提交日志(LOP_COMMIT_XACT)

上面只是最简单的例子,如果涉及分配空间、页拆分、索引更新、系统表更新等操作,记录条数会增多。
恢复数据
如果想要恢复被删除或被修改的数据,可以根据事务的LSN,可以将数据库恢复到事务执行之前的状态,前提是有过一次全量备份。以上面为例,先查询tbl表,查看内容:

id=6的记录已经被删除了,如果想要恢复,先记下删除事务开始位置对应的LSN:就是上面第97行00000041:00000318:0001,后面恢复日志备份的时候用。
先使用WITH NORECOVERY选项恢复一个全量备份:
restore database biztest2
from disk='D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\biztest.bak'
with move 'BIZTEST' to 'D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\data\biztest2',
move 'biztest_log' to 'D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\data\biztest2_log',
norecovery
恢复完成后,SSSM中查看数据库,会有个“恢复中”的提示

此时数据库还不可用,只能用来继续还原增量备份或事务日志备份。对刚才被删除数据的数据库BIZTEST做一下日志备份

使用上面查到的LSN:00000041:00000318:0001和带STOPBEFOREMARK选项的RESTORE命令:
restore log biztest2
from disk='D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\biztest.trn'
WITH STOPBEFOREMARK ='lsn:0x00000041:00000318:0001',
recovery;

此时,BIZTEST2已经可以用了。执行查询:

id=6的数据恢复成功。
使用fn_dblog函数查看事务日志和恢复数据的更多相关文章
- mysql数据安全之利用二进制日志mysqlbinlog恢复数据
mysql数据安全之利用二进制日志mysqlbinlog恢复数据 简介:如何利用二进制日志来恢复数据 查看二进制日志文件的内容报错: [root@xdclass-public log_bin]# my ...
- mysql通过binlog日志来恢复数据
简介 在生产的过程中有这么一个业务场景:比如我在2016-11-19 09:30:00 通过mysqldump的方式备份了数据库,但是在2016-11-19 10:30:00的时候数据库崩溃了,如果通 ...
- 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色
简介 每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging ...
- MYSQL使用二进制日志来恢复数据
mysqlbinlog工具的使用,大家可以看MySQL的帮助手册.里面有详细的用, 在这个例子中,重点是--start-position参数和--stop-position参数的使用. ·--star ...
- 浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色
简介 生产环境下的数据是如果可以写在资产负债表上的话,我想这个资产所占的数额一定不会小.而墨菲定律(事情如果有变坏的可能,无论这种可能性有多小,它总会发生)仿佛是给DBA量身定做的.在上篇文章介绍的简 ...
- 人人都是 DBA(VI)SQL Server 事务日志
SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...
- SQL Server中的事务日志管理(9/9):监控事务日志
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- (转)解释一下SQLSERVER事务日志记录
本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢 ...
- 解释一下SQLSERVER事务日志记录
解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log ...
随机推荐
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_IL和验证
1.IL 基于栈——所有指令压入一个执行栈,并从栈弹出结果. 2.IL 指令无类型——指令会判断栈中操作数的类型,并执行恰当的操作. 3.IL 最大优势——应用程序的健壮性和安全性. 将 IL 编译成 ...
- P1445 [Violet]樱花
传送门 看到题目就要开始愉快地推式子 原式 $\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$ $\rightarrow \frac{x+y}{xy}=\frac{1}{n! ...
- 09-排序3 Insertion or Heap Sort (25 分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- Java对象排序两种方法
转载:https://blog.csdn.net/wangtaocsdn/article/details/71500500 有时候需要对对象列表或数组进行排序,下面提供两种简单方式: 方法一:将要排序 ...
- my.资料__2017暑假
1.http://tieba.baidu.com/p/5254412093 http://www.pipaw.com/mhxy/345616.html [落英缤纷的树下] 地址:长寿村123,24 [ ...
- vue的watch详细用法
https://www.cnblogs.com/shiningly/p/9471067.html https://www.jb51.net/article/139282.htm
- RTT设备与驱动之串口
有一般收发.中断方式.DMA方式: rt_device_t rt_device_find(const char* name); rt_err_t rt_device_open(rt_device_t ...
- Unity 用JSON库序列化与反序列化类,字典
Unity自己的json序列化是不支持字典格式的,但是 json .net库,功能很强大,还支持序列化字典. 下载地址:https://download.csdn.net/download/qq_15 ...
- Python 元组 (tuple)
作者博文地址:https://www.cnblogs.com/liu-shuai/ Python的元组与列表类似,同样可通过索引访问,支持异构,任意嵌套.不同之处在于元组的元素不能修改.元组使用小括号 ...
- C++(SOCKET)简单爬虫制作
先给出代码:(我使用的是VS编译器,需要在项目->project属性-> #include <iostream> #include <stdio.h> #inclu ...