SQL SERVER 数据误操作的恢复
SQL SERVER 数据误操作的恢复
事务日志忠实地记录了数据库的活动,所以基于这些记录的活动就可以随心所欲地将数据库的状态恢复到特定的即时点或故障点。
事务日志备份只能与完整恢复和大容量日志记录恢复模型一起使用。在简单模型下,事务日志可能被破坏,所以事务日志可能不连续,不连续的事务日志备份没有意义,因为基于日志的恢复要求日志是连续的。
因为有了连续的、完整的事备日志序列,配合一个完整的数据库备份,我们可以将数据库的状态恢复到日志序列中的任意一个即时点。
恢复数据到即时点有两个前提:
n 正确的完整数据库的最后一次备份
正确完整的数据库备份是指使用Backup语句、维护计划、手动备份的备份文件,不支持基于数据库文件*.mdf的备份
n 正确的即时点
即所要恢复到数据的时间点
实例:
1. 创建数据DBTEST
2. 创建表TBL_TEST
3. 在表TBL_TEST中插入100条数据
4. 备份现有的数据库
5. 再次向表TBL_TEST中插入50条数据
6. 记录下当前正确数据的时间d1
7. 2分钟模拟误操作将表中所有数据删除
8. 备份数据库尾日志
9. 将数据库恢复到d1时间
1) 创建数据DBTEST
CREATE DATABASE DBTEST |
2) 创建表TBL_TEST
CREATE TABLE TBL_TEST ( ID [int] NOT NULL PRIMARY KEY, NAME [datetime] NOT NULL, ADDRESS varchar(50) NOT NULL ) |
3) 在表TBL_TEST中插入100条数据
use DBTEST declare @i int set @i=1 while(@i<=100) begin INSERT INTO TBL_TEST VALUES (@i,getdate(),'ADDRESS ' + convert(varchar(50),@i)) set @i=@i+1 end select * from TBL_TEST |
4) 备份现有的数据库
--做一次完整数据库备份 backup database DBTEST to disk='C:"DBTEST.bak' |
5) 再次向表TBL_TEST中插入50条数据
use DBTEST declare @i int set @i=101 while(@i<=150) begin INSERT INTO TBL_TEST VALUES (@i,getdate(),'ADDRESS ' + convert(varchar(50),@i)) set @i=@i+1 end select * from TBL_TEST |
6) 记录下当前正确数据的时间d1
当前时间为:2008-5-26 20:13 |
7) 2分钟模拟误操作将表中所有数据删除
DELETE TBL_TEST |
8) 备份数据库尾日志
use master backup log DBTEST to disk='C:"DBTESTLOG.bak' with norecovery |
9) 将数据库恢复到d1时间
--恢复最后一次正常配置
RESTORE DATABASE [DBTEST] FROM DISK = N' C:"DBTEST.bak' WITH NORECOVERY, NOUNLOAD, STATS = 10
RESTORE LOG [DBTEST] FROM DISK = N' C:"DBTESTLOG.bak ' WITH STOPAT='2008-5-26 20:07', NOUNLOAD, STATS = 10
--恢复最后一次正常配置
RESTORE DATABASE [DBTEST] FROM DISK = N' C:"DBTEST.bak' WITH NORECOVERY, NOUNLOAD, STATS = 10
RESTORE LOG [DBTEST] FROM DISK = N' C:"DBTESTLOG.bak ' WITH STOPAT='2008-5-26 20:07', NOUNLOAD, STATS = 10
误删除的数据已经恢复!