基本语法

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函数查看事务日志和恢复数据的更多相关文章

  1. mysql数据安全之利用二进制日志mysqlbinlog恢复数据

    mysql数据安全之利用二进制日志mysqlbinlog恢复数据 简介:如何利用二进制日志来恢复数据 查看二进制日志文件的内容报错: [root@xdclass-public log_bin]# my ...

  2. mysql通过binlog日志来恢复数据

    简介 在生产的过程中有这么一个业务场景:比如我在2016-11-19 09:30:00 通过mysqldump的方式备份了数据库,但是在2016-11-19 10:30:00的时候数据库崩溃了,如果通 ...

  3. 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色

    简介 每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging ...

  4. MYSQL使用二进制日志来恢复数据

    mysqlbinlog工具的使用,大家可以看MySQL的帮助手册.里面有详细的用, 在这个例子中,重点是--start-position参数和--stop-position参数的使用. ·--star ...

  5. 浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色

    简介 生产环境下的数据是如果可以写在资产负债表上的话,我想这个资产所占的数额一定不会小.而墨菲定律(事情如果有变坏的可能,无论这种可能性有多小,它总会发生)仿佛是给DBA量身定做的.在上篇文章介绍的简 ...

  6. 人人都是 DBA(VI)SQL Server 事务日志

    SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...

  7. SQL Server中的事务日志管理(9/9):监控事务日志

    当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...

  8. (转)解释一下SQLSERVER事务日志记录

    本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢 ...

  9. 解释一下SQLSERVER事务日志记录

    解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log ...

随机推荐

  1. Redis学习笔记(5)—— Redis的持久化方案&Redis的集群搭建

    一.Redis的持久化方案 Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种 ...

  2. gradle 使用本地maven 仓库 和 提交代码到maven

    /* * This build file was generated by the Gradle 'init' task. * * This generated file contains a sam ...

  3. stdin stdout stderr 标准I/O流

    Unix中一切皆文件,磁盘等设备在操作系统来看都是文件. 对文件进行操作时,需要打开这个文件,并获得文件描述符(file descriptor, fd) 而每个进程生来就有三个文件描述符绑定在它身上, ...

  4. D - Frogger

    Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...

  5. Flask&&人工智能AI --5 Flask-session、WTForms、数据库连接池、Websocket

    未完待续.... DButils 什么是数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库 ...

  6. photoshop中魔棒工具的使用

    魔术棒工具一般用于纯色背景快速扣图,打开魔术棒工具,设定容差,点击选定背景,清除,文件-保存为png格式图片.ok! 魔棒工具是photoshop中提供的一种比较快捷的抠图工具,对于一些分界线比较明显 ...

  7. 两个数据库通过DataTable实现差异传输

    两个主要方法 /// <summary>/// 用途:/// 用源表和目标表比较,返回差异的数据(目标表为参照物)/// /// 逻辑:/// 1.合并两个表/// 2.循环合并后得到的表 ...

  8. mc04_IntelliJ IDEA常用设置

    字体设置 File --> Settings --> Font 项目编码设置 File --> Settings --> File Encodings 项目依赖 即一个项目引用 ...

  9. thinkPHP5.0使用form表单提交数据和删除文章,不用TP的提示页面,使用弹出提示信息

    form表单提交数据和删除文章时,TP的默认信息提示页面的看起来不是很好看,想要实现弹窗提示怎么做呢? 前端:可以使用前端的一个知识--iframe,iframe元素会创建包含另外一个文档的内联框架: ...

  10. 30段有用的javascript代码

    1. 如何区分IE及非IE浏览器 if(!+[1,]){ console.log("这是IE浏览器"): } else{ console.log("这不是IE浏览器&qu ...