SQL是可以通过事物日志还原到数据库的任意一个时间点的。
但是需要几个条件:
1、数据库必须在出问题之前必须存在备份。
-- 对数据库进行备份
BACKUP DATABASE db_test
TO DISK = 'd:/Gwall.bak'
WITH FORMAT
GO
2、在出问题之后,数据库必须没有做过任何 数据库完整备份。因为数据库备份是会对事物日志进行截断处理的。
而数据库恢复是需要通过事物日志进行了,所以如果出问题之后对数据库进行了完整备份,那么就无法取得出问题的事物日志了。
也就等于没有办法恢复到出问题的时间点了。
3、出问题之后,应停止数据库访问,并且进行事物日志的备份。
--备份事务日志(使用事务日志才能还原到指定的时间点)
BACKUP LOG db_test
TO DISK = 'c:/Gwall_log.bak'
WITH FORMAT
GO
补充,在数据库备份之后,事物日志备份可以有多个。但必须记住相应的时间顺序。在恢复时需要按照时间顺序逐一恢复。
因为事物日志的备份其实是只有时间段数据的,即上一次的数据库完整备份或上一次的事物日志备份时间 到当前时间的事物日志数据。
当拿到出问题之前最早的备份和出问题之后的事物日志之后,就可以进行数据库的恢复动作了。
恢复步骤:
1、首选需要有数据库的独占访问权,所以需要其他人和该数据的连接都中断。
2、数据库恢复的时候最好在 USE master 的连接上执行。
3、首先进行出问题前的数据库完整备份的还原。
-- 还原完全备份
RESTORE DATABASE Gwall
FROM DISK = 'd:/Gwall.bak '
WITH REPLACE ,
NORECOVERY
其中,NORECOVERY 你其实就是数据库的锁,在还原数据库后需要还原后续日志时,必须在还原后带上该值。
4、逐一按照时间点还原事物日志
RESTORE LOG Gwall
FROM DISK = 'd:/Gwall_log.bak'
WITH
STANDBY = 'd:/gwall_redo.bak'
当还原最后一个事物日志时,可以指定时间,进行还原。则数据库将还原到该指定时间点。
DECLARE @start_date datetime
SET @start_date = CONVERT(DATETIME,'2014-08-20 22:02:27.753')
RESTORE LOG Gwall
FROM DISK = 'd:/Gwall_log1.bak'
WITH STOPAT = @start_date ,
STANDBY = 'd:/gwall_redo.bak'
注意:事物日志的还原(包括指定时间点的还原)是不可逆的。如以上指定时间点选还原指定时间为 22:02:27 ,
则下次在还原的时候,时间只能在该时间之后,如果写还原时间为 22:01:00 ,则该还原是无法完成的。
5、在还原到固定时间点后,是可以在当前连接下进行数据库数据的查询的,以确定是否已到达到需要还原的时间点。
6、确定数据还原完成后,则需要将数据库锁解开,完成数据库还原。
-- 显示还原的时间点
SELECT Restoreto = @start_date
-- 完成数据库还原,使数据库可读写
RESTORE LOG Gwall
WITH RECOVERY
以上就完成了通过事物日志进行指定时间点还原的恢复。