基本语法

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. Codeforce-A-Two distinct points(暴力)

    output standard output You are given two segments [l1;r1][l1;r1] and [l2;r2][l2;r2] on the xx-axis. ...

  2. http文件上传/下载

    package unit; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputSt ...

  3. 安装openstack时遇到的错误

    学习opensatck的第一步是安装DevStack来进行本机操作 1. 下面命令没有权限,解决办法:切换到root用户下执行sudo -s echo "stack ALL=(ALL) NO ...

  4. 测试用例逐步演进-xmind2excel(Python版)测试用例逐步演进-xmind2excel(Python版)

    最近,我在做项目的时候,经常被问到一个问题:如何做测试评审会更有效呢? 只要做过测试用例评审,特别是比较复杂的测试用例评审的时候,很多测试同学都会苦恼于如何能更有效的向大家说出自己的测试设计思路. 当 ...

  5. Linux网络编程基础

    1. Linux网络模型 ① OSI七层模型和Linux四层模型 ② 各种协议之间的关系及在Linux模型中的位置 ③ 协议封装:各种协议处于一种层层封装的关系 (1)Ethernet (2)IP * ...

  6. Jenkins 第一次访问时提示Unlock Jenkins

    Jenkins启动后录入网址提示Unlock Jenkins,To ensure Jenkins is securely set up by the administrator Jenkins启动后, ...

  7. oracle数据库的备份与还原

    转自:https://www.cnblogs.com/ylldbk/p/5613365.html 数据导出: 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daoc ...

  8. java——修改txt文件中某一行的内容

    今天无意间看到java.io中有一个类:RandomAccessFile,可以在文件的任意位置进行读写操作,想到我之前写的一个小项目,想在txt中修改某一行的内容,都是从头遍历txt文件,修改这一行的 ...

  9. Android中的下拉列表

    在Web开发中,HTML提供了下拉列表的实现,就是使用<select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>表示即可.这是在Web开发中一个必不可少的交 ...

  10. STM32F3 浮点运算使用

    在keil中使用浮点运算的步骤:在程序中包含#include <math.h>