在我的sql server 2012遇到一些问题后,我只能使用DBCC CHECKDB(xxx,REPAIR_ALLOW_DATA_LOSS)修复数据不一致。该选项的名称暗示,修复数据库时(可能)会有数据丢失。
丢失的数据是什么,损失有多大?
例如,请查看此日志消息:
未引用页面(1:705),第0位,文本ID 328867287793664的行外数据节点。
如果未引用该节点并且它是此节点,则会导致不一致,请将其删除。这不应该伤害任何人。这是MS正在谈论的那种数据丢失吗?
祝你好运, 的Sascha
答案 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。对于此错误,它将删除页面,并且 这样做。在此过程中,页面上的其他所有内容也会丢失, 包括您的银行账户!!