今天在使用sql server 2000 查询时会报错服务器:消息 823,级别 24,在出现这个错误后,再执行查询语句,后续一直出错。因为是客户的服务器,sql server 2000版本相对来说比较老了,没办法,根据这个错误网络搜索了一些解决方案。
最终的原因,可能是数据表出错引起的,根据网上的方案,对表进行了修复。整理方案如下,主要使用以下三句进行修复:
快速修复
DBCC CHECKDB ('数据库名', REPAIR_FAST)
重建索引并修复
DBCC CHECKDB ('数据库名', REPAIR_REBUILD)
如果必要允许丢失数据修复(本人修复使用这种方案,删掉了一部分无用的数据)
DBCC CHECKDB ('数据库名'', REPAIR_ALLOW_DATA_LOSS)
############################################################
注意:
修复过程中,可能出现如下错误:未处理修复语句。数据库需处于单用户模式下。
解决如下,可以先启用单用户模式,方法如下,先切换数据库:
Use master go
然后执行如下命令:
sp_dboption 数据库名, single, true
手工修复数据库举例:
1. 进入SQL查询分析器,执行语句:
-- 检查数据库完整性 dbcc checkdb('mydb')
执行结果:
CHECKDB 发现了 0 个分配错误和 11 个一致性错误(在数据库 'mydb' 中)。 repair_allow_data_loss 是最低的修复级别(对于由 DBCC CHECKDB (mydb) 发现的错误而言)。 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
说明数据库确实有问题,11个错误,找到错误地方:
对象 'Tn_member' 有 3127 行,这些行位于 172 页中。 CHECKDB 发现了 0 个分配错误和 2 个一致性错误(在表 'Tn_member' 中,该表的对象 ID 为 907150277)。
表明 'Tn_member' 表确实有2个错误,所以查询几次后就会出错。
2. 运行语句进行表修复:
-- 以repair_allow_data_loss级别修复表 dbcc checktable('Tn_member',repair_allow_data_loss) go
执行结果:
服务器: 消息 7919,级别 16,状态 3,行 2 未处理修复语句。数据库需要处于单用户模式下。 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
3. 执行出错,需要将数据库改为"单用户模式",于是再执行:
-- 更改成单用户 sp_dboption mydb single, true go -- 已repair_allow_data_loss级别修复表 dbcc checktable('Tn_member',repair_allow_data_loss) go
4. 修复索引表,然后再次修复表
-- 如果还有问题,则尝试修复索引表 DBCC DBREINDEX('Tn_member')
-- 再修复表 DBCC CHECKTABLE('Tn_member',repair_allow_data_loss)
5. 最后验证,直到返回的结果没有错误
--查询是否正常 select * from Tn_member
6. 修复完成,记得还原数据库为多用户模式
-- 还原数据库为多用户模式 sp_dboption 数据库名, single, false