SQL Server 数据库所能处在的几种状态

欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入 数据库所能处在的几种状态,一个完整的模型如下: 数据库所能处在的状态关系 上面的几种状态的具体转换关系超出了本文的讨论范围,但是这里我会强调两种和日志损坏关系很大的状态:RECOVERY_PENDING

欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入

  数据库所能处在的几种状态,一个完整的模型如下:

  数据库所能处在的状态关系

  上面的几种状态的具体转换关系超出了本文的讨论范围,但是这里我会强调两种和日志损坏关系很大的状态:RECOVERY_PENDING和SUSPECT状态。

  假如出现了数据库没有正常关闭,也就是还有数据没有CheckPoint到磁盘,如果数据库要启动就必须经历Recovery过程,如果日志损坏,则无法进行该Recovery过程,就会造成数据不一致的问题。

  此时,数据库可能处于下面两种状态之一:

  RECOVERY_PENDING:需要运行crash%20recovery,但该过程由于资源等待无法开始,比如说日志完全损坏

  SUSPECT:crash%20recovery已经开始,但无法完成

  因此处理该类情况要基于您所在的业务环境是否允许数据损失,可以选择从备份中恢复数据,或是将数据库状态改为EMERGENCY。EMERGENCY模式意味着数据库跳过crash%20recovery阶段,此时虽然可以访问数据库,但是会存在数据事务不一致的问题,如果仅仅是某些数据页不一致还好,但如果是对表结构修改的事务存在,那就可能存在数据库架构不一致的问题。如果您没有合适的备份集,那只能通过该方式来恢复数据。将数据库设置为EMERGENCY模式非常简单,如代码清单1所示。

  ALTER%20DATABASE%20AdventureWorks2012%20SET%20EMERGENCY

  代码清单1.将数据库设置为紧急模式

  与该模式有关的一个选项是REPAIR_ALLOW_DATA_LOSS,该选项依然会执行crash%20recovery过程,但会跳过受损的日子,从而尽可能的修复数据一致性问题,该选项会创建一个新的日志文件,最后使得数据库处于ONLINE状态,使用该选项的一个简单例子如代码清单2所示。

  ALTER%20DATABASE%20AdventureWorks2012%20SET%20SINGLE_USER

  DBCC%20CHECKDB(AdventureWorks2012,REPAIR_ALLOW_DATA_LOSS)

  代码清单2.使用REPAIR_ALLOW_DATA_LOSS选项

  值得注意的是,作为DBA永远是要有“备”无患,上面这些操作是在您准备工作不充分的情况下才要去考虑的。

  数据库处于在线状态,日志损坏

  在这种情况下,如果SQL%20Server在运行时需要使用的日志损坏(比如说回滚时),则SQL%20Server会将数据库下线,并转为SUSPECT模式。

  同样如果没有备份的话,只能考虑使用EMERGENCY模式。

  还有一种方式是,将数据库的恢复模式改为简单,然后手动发起一个CheckPoint来截断日志,最后再将数据库改回完整恢复模式。但这种方式会破坏日志链。但可能会将被%20损坏的日志清除掉。

%20

%20%20

郑重声明:本文版权包含图片归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们(delete@yzlfxy.com)修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

留言与评论(共有 0 条评论)
昵称:
匿名发表
   
验证码: