Sql server 使用“修复”\u“允许”\u“数据丢失”时会丢失什么(类型)数据?

Sql server 使用“修复”\u“允许”\u“数据丢失”时会丢失什么(类型)数据?,sql-server,dbcc,Sql Server,Dbcc,在sql server 2012出现一些问题后,我只能使用DBCC CHECKDB(xxx,修复\u允许\u数据丢失)修复数据不一致。该选项的名称意味着,修复数据库时(可能)会丢失数据 丢失的数据是什么?丢失的危害有多大 例如,查看以下日志消息: 未引用第页(1:705),插槽0,文本ID 328867287793664的行外数据节点 如果该节点未被引用,而正是该节点导致了不一致,请将其删除。这不应该伤害任何人。这就是微软所说的那种数据丢失吗 致以最良好的祝愿, Sascha查看Paul Ran

在sql server 2012出现一些问题后,我只能使用DBCC CHECKDB(xxx,修复\u允许\u数据丢失)修复数据不一致。该选项的名称意味着,修复数据库时(可能)会丢失数据

丢失的数据是什么?丢失的危害有多大

例如,查看以下日志消息:

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

如果该节点未被引用,而正是该节点导致了不一致,请将其删除。这不应该伤害任何人。这就是微软所说的那种数据丢失吗

致以最良好的祝愿,
Sascha

查看Paul Randal的博客文章,了解使用REPOAIR\u ALLOW\u DATA\u LOSS运行DBCC CHECKDB的影响:

REPAIR_ALLOW_DATA_LOSS是DBCC CHECKDB在发现损坏时建议的修复级别。这是因为几乎没有人知道 任何非小的非聚集索引问题都需要 删除某些内容以修复它。因此,修复\u允许\u数据\u丢失将 删除东西。这意味着它可能会删除您的一些数据作为 好。例如,如果在数据页上发现损坏的记录,则 可能最终不得不删除整个数据页,包括所有 页面上的其他记录,以修复损坏。那可能很多 大量的数据。因此,维修级别名称是经过仔细选择的。 你不能在没有意识到你的错误的情况下键入修复\u允许\u数据\u丢失 作为操作的一部分,可能会丢失一些数据

有人问我为什么会这样。修复的目的不是为了保存用户 数据。修复的目的是使数据库具有结构化 尽可能快地一致(以限制停机时间)并正确地一致(以 避免让事情变得更糟)。这意味着必须进行维修 设计为快速可靠的操作,可在任何情况下工作 环境。最简单的方法是删除已损坏的内容,然后 修复所有链接到(或曾经链接到)正在运行的对象的内容 已删除–无论是记录还是页面。想再做点什么吗 复杂会增加维修不起作用的可能性,或 甚至让事情变得更糟

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

要继续上面这个人为的例子,想象一下你的银行 支票账户和储蓄账户恰好存储在同一个账户上 银行SQL Server数据库中的数据页。新的DBA没有 认识到备份对于灾难恢复和数据恢复是必要的 保存,所以不采取任何措施。这场灾难又一次袭击了美国 数据中心外的工作人员意外切割 打开电源后,承载SQL Server的计算机将关闭。这次是一个 的驱动器在断电和页面写入时出现问题 未完成–导致页面撕裂。不幸的是,这是一页 持有你的银行账户。由于DBA没有任何备份,因此 修复破损页面的唯一替代方法是运行 修复\u允许\u数据\u丢失。对于此错误,它将删除该页,然后 这样做。在此过程中,页面上的其他内容也会丢失, 包括你的银行账户

资料来源:

令人高兴的是,据我所知,它实际上没有被记录在案。因此,如果这被认为是最好的做法,它可以做任何事情(无论是现在还是将来的版本、service pack、hotfix等)。