在 Microsoft SQL 2008 及更高版本中,每当 SQL 管理员尝试对 MS SQL Server 表运行复杂的 UPDATE 语句以及 NOLOCK 提示时,都可能会导致非聚集索引损坏。当非聚集索引发生损坏时,SQL Server 错误日志中会记录以下错误消息。
非聚集索引损坏显示如下:
注意: NOLOCK 提示可以应用于语句中的源表,但不能应用于语句中的目标表。
发现非聚集索引损坏后,必须找出问题的原因。
SQL Server 非聚集索引损坏的原因是什么?
SQL 数据库索引损坏的可能原因是 NOLOCK 提示,它造成查询错误地读取表值,或者对数据中的相同值进行多次读取。
如何修复非聚集索引中的损坏?
尽管 Microsoft 针对 SQL 软件推出了定期补丁来解决非聚集索引损坏问题,但解决方案并不那么可靠。
如果补丁不起作用,请按照以下步骤手动修复非聚集索引损坏:
步骤 1:在 SQL 数据库中重建索引
注意:如果索引所在的文件组处于脱机状态或设置为只读,则无法重建索引。
运行 ALTER INDEX REBUILD 命令,并执行以下 T-SQL 查询,重建非聚集索引:
alter index IX_EmailAddress_EmailAddress
on Person.EmailAddress
rebuild
go
上述查询重建了“Person.EmailAddress”表上的“ IX_EmailAddress_EmailAddress ”索引。
重建非聚集索引的缺点
这种重建方法是通过读取旧索引来创建新索引,因此当旧索引中缺少某些行时,新索引也同样会缺少这些行。
步骤2:删除并重新创建索引
还可以使用 SQL Server Management Studio (SSMS) 删除并重新创建损坏的非聚集索引。请按照下列步骤操作:
- 在 SSMS 中,单击并展开Databases下的数据库。
- 右键单击数据库表,然后单击 Script Table as > DROP And CREATE To > New Query Editor Window。
使用 Drop-recreate Index 方法的缺点
虽然 drop-recreate index 可以解决错误,但也有可能会再次发生损坏,或者损坏修复的结果并不理想。
第 3 步:运行 DBCC CHECKDB
运行以下 DBCC CHECKDB 命令以确保数据库恢复正常:
DBCC CHECKDB ('DatabaseName') with NO_INFOMSGS
自行修复 or 求助专业的数据恢复公司
对于专业人员,可以尝试以上修复方法。对于非专业数据库修复人员,请立即联系专业的数据恢复公司,以尽快获得数据库修复,避免问题复杂化以及保护数据不发生丢失现象。鸿萌从事数据恢复近 20 年,拥有丰富的案例经验和专业资深的技术团队,随时为用户提供紧急咨询和数据恢复服务。