使用REPAIR_ALLOW_DATA_LOSS时会丢失哪些(某种)数据?

时间:2013-11-25 08:25:30

标签: sql-server dbcc

在我的sql server 2012遇到一些问题后,我只能使用DBCC CHECKDB(xxx,REPAIR_ALLOW_DATA_LOSS)修复数据不一致。该选项的名称暗示,修复数据库时(可能)会有数据丢失。

丢失的数据是什么,损失有多大?

例如,请查看此日志消息:

  

未引用页面(1:705),第0位,文本ID 328867287793664的行外数据节点。

如果未引用该节点并且它是此节点,则会导致不一致,请将其删除。这不应该伤害任何人。这是MS正在谈论的那种数据丢失吗?

祝你好运, 的Sascha

1 个答案:

答案 0 :(得分:5)

查看Paul Randal的博客文章,了解使用REPOAIR_ALLOW_DATA_LOSS运行DBCC CHECKDB的含义:

  
    

REPAIR_ALLOW_DATA_LOSS是DBCC CHECKDB在发现损坏时建议的修复级别。这是因为几乎要修理     任何不是一个小的非聚集索引问题的东西都需要     删除修复它的东西。所以,REPAIR_ALLOW_DATA_LOSS会     删除东西。这意味着它可能会删除您的一些数据     好。例如,如果它在数据页面上找到了损坏的记录     可能最终必须删除整个数据页面,包括所有数据页面     页面上的其他记录,用于修复损坏。这可能很多     数据的。因此,仔细选择了修复级别名称。     你不能在没有意识到自己的情况下输入REPAIR_ALLOW_DATA_LOSS     作为操作的一部分,可能会丢失一些数据。

  
     

我被问到为什么会这样。修复的目的不是为了节省用户   数据。修复的目的是在结构上建立数据库   尽可能快地(以限制停机时间)和正确(到   避免让事情变得更糟)这意味着必须进行维修   设计为快速可靠的操作,适用于所有操作   环境。这样做的简单方法是删除损坏的内容   修复与事物相关联(或从中链接)的所有内容   已删除 - 无论是记录还是页面。试着做更多的事情   复杂会增加修复不工作的机会,或   甚至让事情变得更糟。

     

这种情况的后果是运行REPAIR_ALLOW_DATA_LOSS即可   对重建事务日志的数据产生相同的影响   在飞行中交易改变用户数据 - 您的业务逻辑,   表之间固有的和约束强制的关系,以及   您的用户数据的基本逻辑完整性都可能被破坏。但,   数据库现在结构一致,SQL Server可以运行   它不用担心可能导致崩溃的腐败。

     

要继续上面的人为例子,想象你的银行   检查和储蓄账户恰好存储在同一个账户上   银行SQL Server数据库中的数据页面。新的DBA没有   意识到备份是灾难恢复和数据所必需的   保存所以没有采取任何措施。灾难再次袭来   数据中心外工作人员的形式意外地切断了   电源和托管SQL Server的机器断电。这一次,一个   断电和页面写入时驱动器出现问题   没有完成 - 导致页面撕裂。不幸的是,这是页面   持有你的银行账户。由于DBA没有任何备份,所以   只有替代修复撕裂页面才能运行   REPAIR_ALLOW_DATA_LOSS。对于此错误,它将删除页面,并且   这样做。在此过程中,页面上的其他所有内容也会丢失,   包括您的银行账户!!

来源:Corruption: Last resorts that people try first…