一次SQLServer索引损坏问题的排查与修复
线上库执行一项数据变更操作时,一直提示"出现错误 8646。请记录该错误和时间,并与您的系统管理员联系。"
通过代码排查,最终确定是在执行某存储过程时触发了如下错误,并指明了位置是在某触发器的具体行:
"内部错误。文件 e:\sql10_main_t\sql\ntdbms\storeng\dfs\startup\dstream.cpp 第 792 行中的字符串例程因 HRESULT 0x8007007a 的错误而失败。"
通过面向google开发,检索到有前辈遇到过类似问题,说明可能是索引损坏导致了此问题。相关链接[1][2]
为了验证,需要通过DBCC对疑似有问题的索引进行校验,脚本代码如下
declare @index_id int set @index_id = (select index_id from Sys.Indexes where name='[索引名]') DBCC CHECKTABLE('[表名]',index_id=@index_id)
校验后,发现问题果然出在这个索引上,接下来就是重建该索引,脚本代码如下
ALTER INDEX [索引名] ON [表名] REBUILD
重建索引后,重新DBCC校验,没有异常,问题解决。