怎么查看 日志备份中的 数据?

cqq 2011-07-14 10:12:29
SQL2005

我们的系统的备份策略是这样的,
每天一个完整备份, 每6个小时一个差异备份,每10分钟一个日志备份。

今天突然发现某个表中的数据丢失了一部分,
我想查一下是什么时候丢失的。

我能想到的很笨的方法是,挨个的时间点试试, 比如先还原到昨天晚上10点, 如果仍然丢失,
再还原到8点这样一点点找到最近的那个时刻。

还有没有什么比较方便的方法?
比如能直接查看日志备份,看看是否存在删除操作?
...全文
233 点赞 收藏 8
写回复
8 条回复
唐诗三百首 2011年07月14日
restore指令有个参数(STANDBY)刚好是for楼主这个需求的.
可以还原数据库为只读状态,供边恢复边查询使用的.

restore database [数据库名]
from disk='[备份文件]'
with standby='[临时数据文件路径\文件名]'
回复 点赞
兔子党党务院院长 2011年07月14日
楼主去看看Log Explorer日志工具。

看看管理工具里的事件探查器有没有记录什么。
回复 点赞
叶子 2011年07月14日
SQL SERVER 2005可以使用Log Explorer查看。
回复 点赞
快溜 2011年07月14日
回复 点赞
cd731107 2011年07月14日
介绍
Log Explorer主要用于对MSSQLServer的事物分析和数据恢复。你可以浏览日志、导出数据、恢复被修改或者删除的数据(包括执行过update,delete,drop和truncate语句的表格)。一旦由于系统故障或者人为因素导致数据丢失,它能够提供在线快速的数据恢复,最大程度上保证恢复期间的其他事物不间断执行。

他可以支持SQLServer7.0和SQLServer2000,提取标准数据库的日志文件或者备份文件中的信息。

其中提供两个强大的工具:日志分析浏览,对象恢复。具体功能如下:

l 日志文件浏览

l 数据库变更审查

l 计划和授权变更审查

l 将日志记录导出到文件或者数据库表

l 实时监控数据库事物

l 计算并统计负荷

l 通过有选择性的取消或者重做事物来恢复数据

l 恢复被截断或者删除表中的数据

l 运行SQL脚本



产品
LogExplore包含两部分

l 客户端软件

l 服务器代理

服务器端代理是保存在SQLServer主机中的一个只读存储过程,他的作用是接受客户端请求,读取在线事物日志块并通过网络传给客户端软件,由客户端软件来读取这些原始的数据块来完成Log Explore所提供的所有功能。

他依赖来的网络协议包括:

l Named Pipe:局域网中适用

l Tcp/Ip:广域网中适用



数据库相关介绍


事物日志(Transaction Log)
SQLServer的每个数据库都包含事物日志,它以文件的形式存储,可以记录数据库的任何变化。发生故障时SQLServer就是通过它来保证数据的完整性。



操作(Operation)
操作是数据库中定义的"原子行为",每个操作都在日志文件中保存为一条记录。它可以是用户直接输入的SQL语句,比如标准的insert命令,日志文件中便会记录一条操作代码来标志这个insert操作。



事物(Transaction)
事物是一系列操作组成的序列。他可以理解为直观的不可分割的一笔业务,可以执行成功或者失败。典型的事物比如由应用程序发出的具有开启-提交功能的一组SQL语句。不同的事物靠事物Id号(transaction ID)来区分,具有相同ID的事物记录的日志也相同。



在线事物日志(Online Transaction Log)
在线事物日志是指当前活动数据库所用的日志。可以通过如下命令来确定其对应文件

Select * from SYSFILES

他的文件后缀名一般是.LDF



离线事物日志(Offline Transaction Log)
离线事物日志是指非活动数据库所用的日志。当其数据库处于关闭(ShutDown)才状态下可以进行复制备份操作。他的结果同在线事物日志完全相同。



备份文件
备份文件是保存食物日志备份的文件,通常管理员通过运行SQL语句或者企业管理器来生成该文件。备份文件的内部结构和事物日志不同,他采用称为MTF的格式来保存数据。一个备份文件可以包含一个日志的多组备份,甚至包括多个数据库的混合备份.



设置为自动收缩
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"

强烈要求该项不要选中.否则SQLServer将已循环的方式来覆盖先前的日志记录,将会导致LogExplore无法恢复错误.





数据恢复介绍
LogExplore允许你恢复应为误操作或者程序错误而导致的数据丢失或者更改.比如执行update\Delete语句时丢失了where子句,或者错误使用了Dts功能.

LogExplore不支持直接修改数据库.他可以生成事物的逆操作脚本.

如果log是delete table where ...的话,生成的文件代码就是insert table ....

你可以通过SQL查询分析器,或者LogExplore的Run SQL Script功能来执行生成脚本.



关于Undo
Undo功能可以逆操作一组指定的用户事物。包括insert,delete和update,其局限性如下:

l 事物类别:LogExplore只能undo用户事物。用户事物是指在用户表上定义的事物,不支持系统表的更新恢复。同时,他也不支持计划变更的回滚。

l Blob类型:包括text,ntext,image类型。LogExplore只支持这些类型的insert和delete恢复,不支持update语句恢复。



关于redo
Redo功能可以再次运行一组指定事物。它可以在以下情况中用到:

丢失数据库而且没有任何备份文件。

l 如果原始日志文件没有丢失可以通过Redo来实现恢复。

l 通过完整备份文件来把数据库恢复到某指定时间点,再通过redo功能完整恢复。它可以重放Create Table和Create Index命令,来重新生成被删掉的表,同时也受blob字段的限制。

拯救Dropped/Truncate命令导致的数据丢失
执行Drop Table和Truncate Table命令虽然会被SQLServer记录到日志文件中,但是并不记录被删除的数据。你可以使用LogExplore提供的功能来恢复这些数据。LogExplore提供两种机制来恢复被Drop或者Truncate的数据。

1、如果你有备份文件可以直接通过备份文件恢复。

2、通过LogExplore提供的方法来恢复。

当执行如上命令时,SQLServer会将保存数据的页面放入空闲页面列表中。如果此页没有被再次使用则将一直保存原始数据。恢复时,LogExplore将从空闲页面列表中搜寻没有被再次使用的页面,然后生成一个SQL脚本来从这些页面重组原始数据。LogExplore可以确定被删掉的原始数据行,并在完成时显示原始行数和实际恢复的行数,由此可以断定是否全部恢复。

回复 点赞
Mr_Nice 2011年07月14日
恢复备份的方法虽然笨拙,但还是有效的。

另外,log explorer 倒是可以看日志文件,但查询的量比较大。
回复 点赞
Austindatabases 2011年07月14日

[Quote=引用楼主 cqq 的回复:]
SQL2005

我们的系统的备份策略是这样的,
每天一个完整备份, 每6个小时一个差异备份,每10分钟一个日志备份。

今天突然发现某个表中的数据丢失了一部分,
我想查一下是什么时候丢失的。

我能想到的很笨的方法是,挨个的时间点试试, 比如先还原到昨天晚上10点, 如果仍然丢失,
再还原到8点这样一点点找到最近的那个时刻。

还有没有什么比较方便的方法?
比如能直接查看……
[/Quote]

这个问题并不好解决,请你多查看日志
回复 点赞
--小F-- 2011年07月14日
使用Log Explorer查看和恢复数据 

Log Explorer 4.1.可用于SQL Server2005的日志查看工具

下载地址:
http://download.csdn.net/source/620271

使用方法:

打开Log Explorer -> Attach Log File -> 选择SQL Server服务器和登陆方式 -> Connect ->
在Database Name中选择数据库 -> Attach-> 左面对话框中Browse-> View Log-> 就可以看到log记录了

想恢复的话: 右键Log记录 Undo Transation-> 选择保存文件名和路径-> 然后打开该文件到查询分析器里执行
T-sql代码就可以了

例如 如果Log是delete table where ...的话,生成的文件代码就是insert table ....
然后将此insert table的代码放到查询分析器里执行.就可以恢复数据.


----------------------------------------------------------------------
--如何恢复被delete/update的数据
----------------------------------------------------------------------
1 连接到被删除数据库的Db
打开log explorer 选择 "file"->"attach log file"->选择服务器和登陆方式->"connect"->选择"数据库"->"attach"
2 查看日志
在左面操作项目的对话框中选择"browse"项目->"view log"->就可以看到当前的Log记录了
3 恢复数据
右键某一条log记录,选择"undo transation"->"选择保存文件名和路径"->然后打开该文件到查询分析器里执行
T-sql代码就可以了
例如: 如果log是delete table where ...的话,生成的文件代码就是insert table ....




----------------------------------------------------------------------
--Log Explorer恢复被drop table和truncate table后的数据
----------------------------------------------------------------------
1 连接到被删除数据库的Db
操作同上
2 恢复方法
1) 选择"salvaage dropped/truncate"菜单,在右边的对话框中选择表名,和droped/trucated的日期,
File Name中选择生成insert语句脚步的存放位置,condition选择是droped还是truncated,
最后点击"create" 就会生成insert语句,把生成的语句到查询分析器里面执行一下就可以了
2) 选择"ViewDDL Commands"菜单->选"truncate table" 操作项->点击"Salvage"->生成语句->查询分析器里执行


----------------------------------------------------------------------
--log explorer使用的几个问题
----------------------------------------------------------------------
1) 对数据库做完全/差异/日志备份
备份时如果选用了删除事务日志中不活动的条目
再用Log explorer打试图看日志时,提示No log recorders found that match the filter,would you like to view unfiltered data 选择yes 就看不到刚才的记录了

如果不选用了删除事务日志中不活动的条目
再用Log explorer打试图看日志时,就能看到原来的日志并做恢复
2) 修改了其中一个表中的部分数据,此时用Log explorer看日志,可以作日志恢复
3) 然后恢复备份,(注意:恢复是断开log explorer与数据库的连接,或连接到其他数据上,
否则会出现数据库正在使用无法恢复)
恢复完后,再打开log explorer 提示No log recorders found that match the filter,would you like to view unfiltered data,选择yes 就看不到刚才在2中修改的日志记录,所以无法做恢复.
4) 不要用SQL的备份功能备份,搞不好你的日志就破坏了.

正确的备份方法是:
停止SQL服务,复制数据文件及日志文件进行文件备份.

然后启动SQL服务,用log explorer恢复数据
回复 点赞
发动态
发帖子
应用实例
创建于2007-09-28

1.1w+

社区成员

6.8w+

社区内容

MS-SQL Server 应用实例
社区公告
暂无公告