WithCoderWithCoderWithCoder

sql server 2000 查询时会报错服务器:消息 823,级别 24,使用DBCC CHECKDB 手工修复数据库

    今天在使用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


欢迎分享交流,转载请注明出处:WithCoder » sql server 2000 查询时会报错服务器:消息 823,级别 24,使用DBCC CHECKDB 手工修复数据库