数据库损坏可能由多种内部和外部因素引起,例如突然的电源故障、系统突然关闭、硬件故障、存储空间不足、恶意软件/病毒感染等。数据库损坏可能导致各种错误甚至数据无法访问。
为了检测和修复数据库损坏,SQL Server提供了DBCC CHECKDB命令。DBCC CHECKDB命令彻底扫描数据库并检查数据库中所有对象的完整性,如页面、表、视图等。它还可以检测撕裂页面、校验和失败等数据库中的问题。它有助于识别和解决与损坏相关的问题、页面级损坏问题以及SQL数据库中的结构问题。
DBCC CHECKDB命令对数据库执行完整性和其他结构检查。如果任何检查失败,该命令会显示一致性错误,并推荐适当的选项来修复数据库。以下是使用DBCC CHECKDB命令检查和修复SQL数据库的逐步说明。
首先,您需要执行以下DBCC CHECKDB命令以检查数据库是否损坏。
SQL DBCC CHECKDB ‘数据库名’;
如果数据库无法访问,则将其状态更改为紧急模式。此模式允许管理员以只读方式访问。要将数据库更改为紧急模式,请运行以下命令:
SQL ALTER DATABASE [数据库名] SET EMERGENCY
将数据库状态更改为紧急模式后,再次执行DBCC CHECKDB命令。如果命令显示一致性错误,则需要使用命令推荐的修复选项来修复数据库。
要修复数据库,首先将其设置为单用户模式,以阻止其他用户在修复过程中修改数据。为此,请运行以下查询:
SQL ALTER DATABASE 数据库名 SET SINGLE_USER
然后,运行DBCC CHECKDB命令推荐的修复选项。它将是REPAIR_REBUILD、REPAIR_FAST或REPAIR_ALLOW_DATA_LOSS。
如果推荐使用REPAIR_REBUILD选项,请运行以下命令。此修复选项可以重建索引,包括非聚集索引。
SQL DBCC CHECKDB (‘数据库名’, REPAIR_REBUILD);
注意:REPAIR_REBUILD选项可以帮助解决数据库中的轻微损坏。REPAIR_REBUILD选项仅用于向后兼容性维护语法。它无助于解决数据库中的复杂损坏问题。
要快速重建数据库,可以使用REPAIR_FAST选项。以下是命令:
SQL DBCC CHECKDB ('数据库名', REPAIR_FAST) GO
如果DBCC CHECKDB命令推荐使用REPAIR_ALLOW_DATA_LOSS选项,则运行以下命令:
SQL DBCC CHECKDB (‘数据库名’, REPAIR_ALLOW_DATA_LOSS);
此修复选项读取并使用疑似页面来解决损坏问题,这增加了恢复数据库的机会。它可以解决数据库中的所有类型的损坏错误,但可能会导致数据丢失。因此,建议将REPAIR_ALLOW_DATA_LOSS选项作为修复数据库的最后手段。
带有REPAIR_ALLOW_DATA_LOSS选项的DBCC CHECKDB命令可能会在SQL数据库中释放行或页面以解决问题。释放的数据有时可能变得无法恢复。
您可能需要多次使用DBCC CHECKDB命令来修复数据库中的所有错误,这很耗时。
有时,该命令可能导致数据库中的逻辑不一致。
它无法恢复数据库中的完整数据。
使用DBCC CHECKDB命令修复大型数据库很耗时。它可能导致延长停机时间。
尽管DBCC CHECKDB命令可以解决数据库中的损坏问题,但它不足以应对复杂的损坏问题,也可能导致数据丢失。为了克服这些限制,您可以使用第三方SQL修复工具,如Stellar Repair for MS SQL。它被MVP和IT专家推荐用于快速修复损坏的SQL数据库文件(包括MDF和NDF)。该工具从损坏的数据库中恢复所有对象,如表、页面、索引等,并将它们保存到新的数据库文件中。
以下是DBCC CHECKDB和Stellar Repair for MS SQL的快速比较。
DBCC CHECKDB | Stellar Repair for MS SQL |
---|---|
需要知识和技能来使用DBCC CHECKDB命令以成功修复过程。 | 易于使用的用户界面,不需要任何技术技能即可执行修复过程。 |
使用DBCC CHECKDB命令与REPAIR_ALLOW_DATA_LOSS选项可能会导致数据丢失。 | 从损坏的数据库中恢复所有数据,如表、触发器、索引等,保持完整性。 |
可能需要多次运行DBCC CHECKDB命令才能完全修复数据库。这可能很耗时。 | 只需要几个步骤就可以修复SQL数据库。 |
支持Windows和Linux操作系统。 | 支持Windows和Linux操作系统。 |
DBCC CHECKDB命令可以免费使用。 | 付费修复工具,具有高级功能。 |
没有预览可恢复对象的选项。 | 在保存之前提供预览可恢复对象的选项。 |
修复数据的准确性没有100%的保证。 | 保持恢复数据的完整性。 |
没有多个文件保存选项。 | 可以选择将修复的数据库保存为新数据库、实时数据库以及其他格式,如HTML、XLS、SQL脚本等。 |
以下是使用Stellar Repair for MS SQL修复损坏的SQL数据库的逐步说明: