前几天解决客户问题时,碰到一个现象。
当客户查询一张表时,报错, 如下:
Location: statutil.cpp:3225
Expression: m_fInitialized && m_statBlob.CbSize() && iKey >= -1 && iKey < m_statBlob.GetHeader()->GetKeyCount()
SPID: 61
Process ID: 1876
消息 3624,级别 20,状态 1,第 1 行
系统断定检查已失败。有关详细信息,请查看 SQL Server 错误日志。通常,断定失败是由软件错误或数据损坏导致的。若要检查数据库是否已损坏,请考虑运行 DBCC CHECKDB。如果您同意在安装过程中将转储发送到 Microsoft,则将向 Microsoft 发送微型转储。更新可能在 Microsoft 的最新 Service Pack 或技术支持部门的 QFE 中提供。
消息 0,级别 20,状态 0,第 0 行
当前命令发生了严重错误。应放弃任何可能产生的结果。
Expression: m_fInitialized && m_statBlob.CbSize() && iKey >= -1 && iKey < m_statBlob.GetHeader()->GetKeyCount()
SPID: 61
Process ID: 1876
消息 3624,级别 20,状态 1,第 1 行
系统断定检查已失败。有关详细信息,请查看 SQL Server 错误日志。通常,断定失败是由软件错误或数据损坏导致的。若要检查数据库是否已损坏,请考虑运行 DBCC CHECKDB。如果您同意在安装过程中将转储发送到 Microsoft,则将向 Microsoft 发送微型转储。更新可能在 Microsoft 的最新 Service Pack 或技术支持部门的 QFE 中提供。
消息 0,级别 20,状态 0,第 0 行
当前命令发生了严重错误。应放弃任何可能产生的结果。
看到这错误 ,给人的第一印像是 数据库里是不是有坏页了,所以随即对整个库做 DBCC CHECKDB 的检查(当然对那特定的表做检查也是快速定位错误的一种途径),但检查的 0 个分配错误和 0 个一致性错误 。这倒让我有些差异,随即查看 error log ,发现用户在几分钟前重启过sql server 服务,并且当时数据库里的这张表正在重新组织索引,那么这时就把这问题基本上缩小范围了。
此时,我这样做了一下验证,通过其它字段查询同样一条内客是可以的,但就是用特定的那个字段去查询会报错,又通过 sp_helpindex 查看这张表上的索引情况,发现出问题的字段上果然有索引,所以让客户把涉汲这个字段的索引全部删除重建,再去查询就正常了。
事后问客户,为啥重启sql 服务,他们说在重新组织索引时,发现等了半天也没有动静,以为卡死了,所以就重启了。
关于重建索引,重新组织索引,以及联机索引的知识,请参考后续的博客,谢谢。