将SQL数据库还原到某个时间点

前提条件:

1、  完全备份的数据库要早于数据库还原到某个时间点的备份

2、  时间点处的日志要进行完整备份

 

db2中可以使得数据库回复到指定的时间点,sql server数据库的恢复模型设置为完全模式即recovery model为full 或者bulk copy的时候,是可以从日志来恢复数据库的。实际上日志中记录的一条一条的transact sql语句,恢复数据库的时候会redo这些sql语句。
前提条件:mybbs是数据库test中的一个表,
数据库test的recovery model为full。而auto close,auto shrink两个选项未选中。数据库test的data files和log files均为默认的自动增长状态。

例子:
A> 2004/10/13,16:00进行数据库备份,backup database test to disk=d:\db\1600.bak with format
B> 2004/10/14,13:00对数据库进行了update,delete等操作;
C> 2004/10/15,18:00使用delete mybbs where id>300时,语句误写成delete mybbs,因而删除了表mybbs中的所有数据。

现在在c点,c点对数据库进行了误操作,我们希望数据库能够恢复到c之前的状态,比如恢复到10月15日17:50分的状态。
要恢复数据库b点,使用的是a点备分的数据库1600.bak;而使用的日志备分是最新的备分1820.log。因而进行如下操作:

一、             完整备份数据库前,使数据库的恢复模式修改为完整恢复模式。

因为只有使用完整备份的数据库、日志才能恢复到某个时间点。使用 ALTER DATABASE 数据库名 SET RECOVERY FULL 将数据库设置为使用完整恢复模式。具体语句如下:
Alter database test

Set recovery full;

二、             恢复过程的第一步是执行尾日志备份

在发现问题时——10月15日18:00,对数据库的日志进行完整备份。使用with format参数,具体语句如下:

Backup database test to disk=’ d:\1820.bak’ with format
backup log test to disk=d:\1820.logs with format  *日志文件进行完整备份*

 

三、             最近日期的一个完整的数据库备份(这些文件通常使用.bak为扩展名);你需要恢复这个完整的数据库备份。
此例中就是恢复10月13日进行的数据库完整备份——1600.bak。使用with norecovery参数,具体语句如下:
restore database test from disk=d:\db\1600.bak with norecovery,replace

四、             使用尾日志备份恢复数据库到某个时间点。

此例中就是: 使用日志备份——1820.bak恢复数据库到10月15日17:50分。使用with recovery,stopat参数,具体语句如下:
restore log test from disk=d:\1820.logs with recovery,stopat=’10/15/2004 17:50 PM’

上面的三条transact sql语句的对应过程:
1.恢复数据库到a点;
2.执行a-b之间的log记录,把数据库恢复到b点.

这样就恢复数据库到了指定的时间点。如果恢复不成功,可能的原因是:1.未使用正确的备分数据库;2.数据库选项选中了auto shrink.

注意:

  • NORECOVERY:告诉SQL Server你没有完成恢复数据库的过程,随后会出现恢复文件。当数据库处于这种状态时,数据库还不能使用,因而不允许建立连接。
  • RECOVERY:告诉SQL Server你已经完成数据库恢复过程,数据库即将准备就绪。这是默认选项,也是最常用的选项。
  • STANDBY:告诉SQL Server当前数据库还未为完成恢复做好准备,随后可以使用日志文件进行恢复。如果必要,你可以使用这个选项为恢复数据库建立连接。但是,如果当前不存在连接,将来的事务日志只能应用于数据库。

一旦你使用NORECOVERY选项恢复了完整备份,你可以开始应用事务日志备份或差异备份

出现的问题:

1、  还原过程中出现“restore log异常终止”,然后,数据库图标旁边出现“正在还原”。

解决方法:确定还原完毕,可以使用下面的语句;

     Restore database 数据库名 with recovery;

2、  还原过程中出现“因为数据库正在使用,所以无法获得对数据库的独占访问权。”或者出现如图的提示

解决方法:第一种方法,

             关闭SQL Server服务,然后,重启SQL Server服务

          第二种方法,执行下面的SQL语句

                ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE

 

方法二——使用LOG Explorer File

用解压缩密码解开后,压缩包里也有一个注册机的

打开log explorer file=>attach log file->选择服务器和登陆方式->connect->
选择数据库->attach->左面对话框中browse->view log->就可以看到log记录了
想恢复的话: 右键log记录 undo transation->选择保存文件名和路径->然后打开该文件到查询分析器里执行

T-sql代码就可以了

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

原文地址:https://www.cnblogs.com/lvfeilong/p/lkvfvcv.html