时间:2021-07-01 10:21:17 帮助过:85人阅读
欢迎进入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来截断日志,最后再将数据库改回完整恢复模式。但这种方式会破坏日志链。但可能会将被 损坏的日志清除掉。