欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

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

程序员文章站 2024-01-19 16:58:52
...

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

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

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

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

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

  上面的几种状态的具体转换关系超出了本文的讨论范围,但是这里我会强调两种和日志损坏关系很大的状态: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来截断日志,最后再将数据库改回完整恢复模式。但这种方式会破坏日志链。但可能会将被 损坏的日志清除掉。

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