ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 数据库 >> SqlServer >> sql 2008下通过fn_dblog解析事务操作日志恢复数据

sql 2008下通过fn_dblog解析事务操作日志恢复数据

来源:网络整理     时间:2015-09-20     关键词:

本篇文章主要介绍了" sql 2008下通过fn_dblog解析事务操作日志恢复数据",主要涉及到方面的内容,对于SqlServer感兴趣的同学可以参考一下: 一、应用情形SQL 2008下执行update或delete语句忘记带where语句,从而导致大量数据的丢失。二、原理在完整恢复模式下,SQL Server会记...

一、应用情形

SQL 2008下执行updatedelete语句忘记带where语句,从而导致大量数据的丢失。

二、原理

在完整恢复模式下,SQL Server会记录每个事务所做的操作,这些记录会存储在事务日志里。

三、解决方案

一般情形下,我们只需要将数据库恢复到发生误操作之前的时刻即可。具体方案请参考http://blog.csdn.net/dba_huangzj/article/details/8491327

同时上文中的解决方案也提出自身的局限和弊端。

弊端:1 如果你发现误操作以后还有很多人做了操作,那么你还原成功后,别人的操作就会冲掉,所以发生误操作后,要马上停止别人对数据库的操作。

       局限:必须具备以下条件

1,这个数据库有原始的状态[备份/新建库].

2,在这个原始状态之后,日志没有被删除过.(或者日志链连续)

3,记住你误操作的时间.

接下来我们探讨在以上方案不能解决问题的情况下,如何自行解析事务日志以恢复丢失的数据。

第一步:使用fn_dblog()读取事务操作日志。这里对fn_dblog()仅做简单介绍。

    使用:::fn_dublog(@StartingLSN,@EndingLSN)

其中两个参数分别开始的LSN号和结束的LSN号。默认情况下,可以使用null.如果@StartingLSN设置为null,表示从首个日志开始查询,如果@EndingLSN为null,表示一直查询到日志的末尾记录为止。在事务日志中,数据的变化被记录在一个连续的日志记录中,且每个记录都有一个编号,叫做日志序列编号(Log Sequence Number,LSN),LSN递增。

Fn_dblog()查询结果中主要字段含义

Begin  Time

事务开始时间

CurrentLSN

当前操作的LSN

Operation

当前操作的操作类型

TransactionID

当前操作所属的事务ID

AllocUnitName

操作相关的表的名称

更多字段含义后续介绍

       要恢复误操作的数据,首先我们要定位到具体的事务ID(TransactionID),通常我们已知误操作时间的大致范围,相关的表名,以及操作类型。可以通过如下语句定位事务ID

       Selecttop 1000   a.[ Begin Time] ,*from :: ::fn_dublog(null,null)a

Wherea.[ Begin Time] is not null

Anda.[ Begin Time]>’2015/09/02’

Anda.[ Begin Time]<’2015/09/01’

Anda. Operation like ‘LOP_DELETE_%’—具体操作相关

Anda. AllocUnitName like ‘dbo.TableName%’—表名

Orderby a.[ Begin Time] desc

    通常情况下,上述语句可以很快得到查询结果。当时当事务日志文件很大的情况下,查询时间是很难接受的。比如在23G的日志文件下查询接近1小时。因为我们将第一个参数设置为null,默认从日志的开头开始查询。因此我们应该进来那个使得开始的LSN接近我们误操作时的LSN.我们可以在msdb系统数据库中的msdb.dbo.backupset表或msdb.dbo.logmarkhistory表中的first_lsn和last_lsn相关字段中寻找离误操作最近的lsn.备份会记录开始lsn和结束lsn.

    我们将会找到离误操作最近的lsn,格式如:'00000021:00000120:0001'(十六进制)

但是fn_dblog()第一个参数接受的类型是数值类型,因此我们要将对应的十六进制转换成数值:33000000028800001

       关于十六进制LSN转换成十进制请参看以下文章:(注意将结果类型INT改为BIGINT

http://blog.csdn.net/misterliwei/article/details/44158017

       这样我们就可以查询到误操作对应的TransactionID。再通过fn_dblog()即可查询到对应事务的详细操作日志。解析每个事务操作记录,即可恢复我们丢失的数据。

    对于insert、delete和update操作的事务日志解析请参看我的博客

如有疑问请联系710308412@qq.com

以上就介绍了 sql 2008下通过fn_dblog解析事务操作日志恢复数据,包括了方面的内容,希望对SqlServer有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_176098.html

相关图片

相关文章