如何从数据库的完整日志模式还原误删除的数据 .
2011-12-23 15:20
507 查看
原理与实现要点:
假设出问题的数据库为A, 新恢复后的数据库为B
1.前提:A数据库的恢复模式必须为:完整。
2.备份A数据库的日志,假设文件名为log.bak
3.使用A数据库的最近的完整备份,使用 WITH NORECOVERY 的方式,恢复为B数据库
4.使用恢复日志的方式,指定还原的时间点(T),将Log.bak文件还原到B数据库,完成后,B数据库的内容即是T时间之前的完整数据。
--创建A数据库
CREATE DATABASE A
GO
--对A数据库进行备份
BACKUP DATABASE A TO DISK= 'c:\A.bak ' WITH FORMAT
GO
--创建测试表
CREATE TABLE A.dbo.TB_test(ID int)
GO
--插入数据
Insert Into A.dbo.TB_test(ID)
select 1
GO
--延时1秒钟,再进行后面的操作
--(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
WAITFOR DELAY '00:00:01 '
GO
--假设我们现在误操作删除了 A.dbo.TB_test 这个表
DROP TABLE A.dbo.TB_test
--为了测试还原时间点,先记录操作的时间点
SELECT dt=GETDATE() INTO #T
GO
--在删除操作后,发现不应该删除表 TB_test
--下面演示了如何恢复这个误删除的表 TB_test,以及数据行
--为了避免覆盖A数据库,恢复时,生成到B数据库
GO
--首先,备份A数据库的事务日志(使用事务日志才能还原到指定的时间点)
BACKUP LOG A TO DISK= 'c:\A_log.bak ' WITH FORMAT
GO
--接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行),生成数据库B
RESTORE DATABASE B FROM DISK= 'c:\A.bak '
WITH FILE = 1, MOVE N'A' TO N'C:\B.mdf',
MOVE N'A_log' TO N'C:\B.ldf', NORECOVERY, REPLACE
GO
--将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
DECLARE @dt datetime
SELECT @dt=DATEADD(ms,-20,dt) FROM #T --获取比表被删除的时间略早的时间
RESTORE LOG B FROM DISK= 'c:\A_log.bak ' WITH RECOVERY,STOPAT=@dt
GO
--查询一下,看表是否恢复
SELECT * FROM B.dbo.TB_test
--最后删除我们做的测试环境
DROP DATABASE A
DROP DATABASE B
DROP TABLE #T
以下为测试语句
view plaincopy to clipboardprint?
假设出问题的数据库为A, 新恢复后的数据库为B
1.前提:A数据库的恢复模式必须为:完整。
2.备份A数据库的日志,假设文件名为log.bak
3.使用A数据库的最近的完整备份,使用 WITH NORECOVERY 的方式,恢复为B数据库
4.使用恢复日志的方式,指定还原的时间点(T),将Log.bak文件还原到B数据库,完成后,B数据库的内容即是T时间之前的完整数据。
--创建A数据库
CREATE DATABASE A
GO
--对A数据库进行备份
BACKUP DATABASE A TO DISK= 'c:\A.bak ' WITH FORMAT
GO
--创建测试表
CREATE TABLE A.dbo.TB_test(ID int)
GO
--插入数据
Insert Into A.dbo.TB_test(ID)
select 1
GO
--延时1秒钟,再进行后面的操作
--(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
WAITFOR DELAY '00:00:01 '
GO
--假设我们现在误操作删除了 A.dbo.TB_test 这个表
DROP TABLE A.dbo.TB_test
--为了测试还原时间点,先记录操作的时间点
SELECT dt=GETDATE() INTO #T
GO
--在删除操作后,发现不应该删除表 TB_test
--下面演示了如何恢复这个误删除的表 TB_test,以及数据行
--为了避免覆盖A数据库,恢复时,生成到B数据库
GO
--首先,备份A数据库的事务日志(使用事务日志才能还原到指定的时间点)
BACKUP LOG A TO DISK= 'c:\A_log.bak ' WITH FORMAT
GO
--接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行),生成数据库B
RESTORE DATABASE B FROM DISK= 'c:\A.bak '
WITH FILE = 1, MOVE N'A' TO N'C:\B.mdf',
MOVE N'A_log' TO N'C:\B.ldf', NORECOVERY, REPLACE
GO
--将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
DECLARE @dt datetime
SELECT @dt=DATEADD(ms,-20,dt) FROM #T --获取比表被删除的时间略早的时间
RESTORE LOG B FROM DISK= 'c:\A_log.bak ' WITH RECOVERY,STOPAT=@dt
GO
--查询一下,看表是否恢复
SELECT * FROM B.dbo.TB_test
--最后删除我们做的测试环境
DROP DATABASE A
DROP DATABASE B
DROP TABLE #T
以下为测试语句
view plaincopy to clipboardprint?
相关文章推荐
- 如何从数据库的完整日志模式还原误删除的数据
- 误删除数据后恢复,要求恢复模式为完整备份或者大容量日志备份
- 数据库被破坏后,数据是完整的,如何对数据进行还原呢
- 不影响数据库运行如何快速恢复刚删除的表及其数据(三)如何恢复刚更新的数百万条数据
- SQL SERVER 数据日志太大,磁盘没有空间,直接删除数据库日志后,显示 恢复挂起。
- 【淘梦网络】thinkphp5根据主键删除数据库和添加数据的完整代码!
- 【WPF学习笔记】之如何保存画面上新建的数据到数据库中并且删除画面上的数据和数据库的数据:动画系列之(五)
- 【恢复】非归档模式下因误删除数据文件导致数据库无法OPEN的故障处理
- 一次血的教训,阿里云rds mysql 数据库,本地化并日志恢复已删除的两天数据
- 如何删除数据库一个表中某列是重复的数据?
- [ mongoDB ] - 文档型数据库设计模式-如何存储树形数据
- flask如何完成数据库内容在html页面上的显示以及相应数据的删除
- 数据库完整恢复模式下的日志增长问题
- 人工误删除InnoDB ibdata数据文件与ib_logile重做日志文件如何恢复详细过程
- 数据库日志太大如何快速删除
- 文档型数据库设计模式-如何存储树形数据
- 如何通过Mysql的二进制日志恢复数据库数据
- 如何从单一的bak文件还原数据库的结果和数据
- 2.数据库没有备份---应如何还原丢失的数据
- 如何删除数据表中的重复数据(各种数据库)