存档
本文介绍我遇到的一例ASE Error: 624的解决过程;所使用的方法仅对我遇到的案例时适用的。
对于Error: 624,主要有两种情况:
一、ASE服务器联机状态中,损坏的非聚簇索引的叶页指向不正确或不存在的RID;
二、ASE服务器自动恢复过程中,事务日志中最后一条检查点记录的数据结构指向日志中不正确或不存在的记录;
问题确认:
我所遇到的这个案例是属于第二种情况,事务日志页指向有错误。
客户反映ASE 15.0.3无法启动,错误日志报错:Error: 624
Adaptive Server failed to retrieve a row via its RID in database 'master' because the requested RID has a higher number than the last RID on the page. 0x28.0xbdb.
ASE将索引标记为“可疑”时,或者ASE的排序顺修改后,索引状态会设置:-32768,
patrol指标SuspectIndex会监控数据库中可疑索引的个数。
查找出现索引索引损坏的表:
存储过程:sp_indsuspect [table_name]
如果不加表名,就是查找当前数据库中因排序顺序更改需被重建的索引的所有表;
或:
select u.name as user_name, o.name as table_name, i.name as index_name,i.status
from sysobjects o, sysindexes i, sysusers u
where o.id = i.id and o.uid = u.uid
--and o.id = object_id('table_name')
and (i.status & -32768) != 0
例子:
1> sp_indsuspect
2> go
Suspect indexes in database dbainfo:
Own.Tab.Ind (Obj_ID, Ind_ID)
----------------------------------------------
dbo.sysqueryplans.csysqueryplans (27, 2)
dbo.sysqueryplans.ncsysqueryplans (27, 3)
修复索引:
建议使用dbcc reindex ({table_name | table_id})
当dbcc reindex发现损坏的索引时,它会删除并重新创建相应的索引。dbcc reindex不会重建系统表的索引。
生成重建用户表索引命令的SQL语句:
select distinct 'dbcc reindex('''|| u.name || '.' || o.name || ''')'
from sysobjects o, sysindexes i, sysusers u
where o.id = i.id and o.uid = u.uid
--and o.id = object_id('table_name')
and (i.status & -32768) != 0
索引重建时间:
系统表sysindexes中有字段crdate记录索引的创建时间。使用dbcc reindex重建索引后,可以通过查询sysindexes.crdate来确认索引的创建时间。
select object_name(id),indid,name,crdate from sysindexes
另外修复索引的方法:
1、保存索引的创建语法,手动删除索引后再创建索引;
2、reorg rebuild table_name index_name