搜索
您的当前位置:首页正文

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

2020-11-09 来源:赴品旅游

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

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

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

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

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

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

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

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

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

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

  ALTER DATABASE AdventureWorks2012 SET EMERGENCY

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

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

  ALTER DATABASE AdventureWorks2012 SET SINGLE_USER

  DBCC CHECKDB(AdventureWorks2012,REPAIR_ALLOW_DATA_LOSS)

  代码清单2.使用REPAIR_ALLOW_DATA_LOSS选项

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

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

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

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

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

Top