SQL Server的还原

系统 1610 0

1.差异备份的还原

不备份结尾日志的情况下还原数据

创建差异备份的放在我们已经在前面一篇博客 SQL Server的备份 中提到了,这里我们不再赘述,下面我们给出差异备份与还原的T-SQL方法,代码如下:

      
        --
      
      
        创建备份设备
      
      
        EXEC
      
       sp_addumpdevice 
      
        '
      
      
        disk
      
      
        '
      
      , 
      
        '
      
      
        MyAdvWorks_1
      
      
        '
      
      , 
      
        '
      
      
        d:\backup\MyAdvWorks_1.bak
      
      
        '
      
      
        ;


      
      
        EXEC
      
       sp_addumpdevice 
      
        '
      
      
        disk
      
      
        '
      
      , 
      
        '
      
      
        MyAdvWorks_diff1
      
      
        '
      
      , 
      
        '
      
      
        d:\backup\MyAdvWorks_diff1.bak
      
      
        '
      
      
        ;


      
      
        EXEC
      
       sp_addumpdevice 
      
        '
      
      
        disk
      
      
        '
      
      , 
      
        '
      
      
        MyAdvWorks_log1
      
      
        '
      
      , 
      
        '
      
      
        d:\backup\MyAdvWorks_log1.bak
      
      
        '
      
      
        ;


      
      
        EXEC
      
       sp_addumpdevice 
      
        '
      
      
        disk
      
      
        '
      
      , 
      
        '
      
      
        MyAdvWorks_log2
      
      
        '
      
      , 
      
        '
      
      
        d:\backup\MyAdvWorks_log2.bak
      
      
        '
      
      
        ;




      
      
        --
      
      
        数据库备份阶段
      
      
        

--
      
      
         创建完整备份
      
      
        BACKUP
      
      
        DATABASE
      
      
         MyAdvWorks 

   
      
      
        TO
      
      
         MyAdvWorks_1 

   
      
      
        WITH
      
      
         INIT;


      
      
        GO
      
      
        --
      
      
         在完整备份之后创建差异备份
      
      
        BACKUP
      
      
        DATABASE
      
      
         MyAdvWorks

   
      
      
        TO
      
      
         MyAdvWorks_diff1

   
      
      
        WITH
      
      
         DIFFERENTIAL;


      
      
        GO
      
      
        --
      
      
        数据库还原阶段
      
      
        

--
      
      
         完整还原
      
      
        RESTORE
      
      
        DATABASE
      
      
         MyAdvWorks

   
      
      
        FROM
      
      
         MyAdvWorks_1

   
      
      
        WITH
      
      
         NORECOVERY;


      
      
        GO
      
      
        --
      
      
         在完整还原之后差异还原
      
      
        RESTORE
      
      
        DATABASE
      
      
         MyAdvWorks

   
      
      
        FROM
      
      
         MyAdvWorks_diff1

   
      
      
        WITH
      
      
         RECOVERY;


      
      
        GO
      
    

在执行上述完整还原的时候,SSMS报错,错误内容如下:

      Msg 
      
        3159
      
      , 
      
        Level
      
      
        16
      
      , State 
      
        1
      
      , Line 
      
        2
      
      
        

The tail 
      
      
        of
      
       the 
      
        log
      
      
        for
      
       the 
      
        database
      
       "MyAdvWorks" has 
      
        not
      
       been backed up. 
      
        Use
      
      
        BACKUP
      
      
        LOG
      
      
        WITH
      
       NORECOVERY 
      
        to
      
      
        backup
      
       the 
      
        log
      
      
        if
      
       it 
      
        contains
      
      
        work
      
       you do 
      
        not
      
       want 
      
        to
      
       lose. 
      
        Use
      
       the 
      
        WITH
      
      
        REPLACE
      
      
        or
      
      
        WITH
      
       STOPAT clause 
      
        of
      
       the 
      
        RESTORE
      
       statement 
      
        to
      
       just overwrite the contents 
      
        of
      
       the 
      
        log
      
      
        .

Msg 
      
      
        3013
      
      , 
      
        Level
      
      
        16
      
      , State 
      
        1
      
      , Line 
      
        2
      
      
        RESTORE
      
      
        DATABASE
      
      
        is
      
       terminating abnormally.
    

这是因为, 对于使用完全恢复模式或大容量日志恢复模式的数据库,在大多数情况下,您必须在还原数据库前备份日志的结尾。   还原数据库而不首先备份日志的末尾将导致错误,除非 RESTORE DATABASE 语句包含 WITH REPLACE 或 WITH STOPAT 子句 ,此子句必须指定数据备份的结束时间或在数据备份结束之后发生的事务。   有关结尾日志备份的详细信息,请参阅 结尾日志备份 (SQL Server) 。RESTORE的语法可以 参考 RESTORE (Transact-SQL) 。为了解决上述错误,我们将完整还原的TSQL语句修改如下:

      
        --
      
      
         完整还原
      
      
        RESTORE
      
      
        DATABASE
      
      
         MyAdvWorks

   
      
      
        FROM
      
      
         MyAdvWorks_1

   
      
      
        WITH
      
      
        REPLACE
      
      
        ,NORECOVERY;


      
      
        GO
      
    

应尽可能避免使用 REPLACE,而且在使用该选项之前必须仔细考虑。   还原一般会防止意外使用一个数据库覆盖另一个数据库。   如果 RESTORE 语句中指定的数据库已存在于当前服务器上,并且指定的数据库系列 GUID 与备份集中记录的数据库系列 GUID 不同,则不还原该数据库。   这是一项重要的安全保护措施。

使用 REPLACE 选项后,就会忽略还原时通常执行的几项重要安全检查。   忽略的检查如下:

  • 还原时使用其他数据库的备份覆盖现有数据库。

    使用 REPLACE 选项后,即使指定的数据库名称与备份集中记录的数据库名称不同,还原也允许您使用备份集中任何一个数据库覆盖现有数据库。   这会导致一个数据库意外覆盖另一个数据库。

  • 在没有获取结尾日志备份并也没有使用 STOPAT 选项的情况下,使用完整恢复模式或大容量日志恢复模式对数据库进行还原。

    使用 REPLACE 选项后,由于没有备份最近写入的日志,您会丢失提交的作业。

  • 覆盖现有文件。

    例如,可能会错误地覆盖错误类型的文件,如 .xls 文件或非联机状态的其他数据库正在使用的文件等。   如果覆盖现有文件,则即使所还原的数据库是完整的,也有可能丢失某些数据。

RECOVERY 和 NORECOVERY 的比较

仔细观察上述完整还原和差异还原的TSQL语句,我们可以看到在 完整还原 阶段,使用了 WITH NORECOVERY ,而 差异还原 ,则是使用了 RECOVERY

  • NORECOVERY 指定 不发生回滚   从而使 前滚 按顺序在下一条语句中继续进行。 在这种情况下,还原顺序可还原其他备份,并执行前滚。
  • RECOVERY(默认值)表示,应在完成当前备份前滚之后执行回滚。 恢复数据库要求要还原的整个数据集(“前滚集”)必须与数据库 一致   如果前滚集尚未前滚到与数据库保持一致的地步,并且指定了 RECOVERY,则数据库引擎将发出错误。
  • 因此RESTORE...WITH RECOVERY状态就表明此时数据库已经处于 一致性 状态了。一般都是数据库还原的最后一步才会使用RESTORE...WITH RECOVERY,其他时候都是使用RESTORE...WITH NORECOVERY。

前滚与回滚的区别  

前滚和回滚是 SQL Server中的两个事务操作。

  • 前滚用于恢复之前的操作。

  比如:执行一个删除一条记录的命令,刚刚把该操作的日志写完(即在日志中已经commit),并准备执行删除操作时,但是此时停电了,因此这条记录的删除工作没有完成。在下次启动SQL Server时,数据库会读取日志最近的一个检查点(checkpoint),然后重做所有已经commit的事务,这就包括之前删除记录的操作。

  • 回滚用于撤销之前的操作。

  比如:我要执行一个银行转账的事务,从账户A中转出1000元到账户B中,在我执行完A-1000的时候,数据库down掉了,此时整个事务还没有执行完,因此事uncommitted的。所以在下次启动SQL Server的时候,数据库会读取日志最近的一个检查点(checkpoint),回滚所有那些uncommitted的事务。比如在这里会撤销A-1000的操作,也就是会往A账户中加回去1000元。 

SQL Server的还原


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论