ASE Error:624一个案例的错误处理过程
本文介绍我遇到的一例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.
首先确定问题发生在master数据库中,接着确认被指向的RID:
十六进制0xbdb表示master数据库中的页号,0xbdb=3035,查看逻辑页面3035上的内容:
dbcc traceon(3604)
go
dbcc page(1,3035,0)
go
输出结果显示ptnid=8 syslogs,这说明逻辑页面3035属于master数据库事务日志,而且页面3035上事务日志记录数为10,
ASE请求的RID的行号0x28=40,很显然大于3035页上的日志记录数。
问题解决:
针对ASE自动恢复过程中发生Error: 624,官方手册上的解决方法是:通常情况下,必须从备份装载数据库!
因为客户没有有效的master数据库的备份文件,也没有master数据库中关键系统表(sysdatabases、sysdevices、sysusages、syslogins、sysattributes等)的硬备份。
所以,不能从备份文件装载master数据库了,必须想其它办法!
步骤如下:
1、修改RUN_file文件,在最后一行加-T3607,不自动恢复所有的数据库;
2、启动ASE服务器,这个时候ASE是能够启动的但不能执行存储过程、修改系统表;
3、执行重建master事务日志的操作;
dbcc rebuild_log(1,1,1)
go
dbcc rebuild_log(1,0,0)go
4、重建一张测试表;
create table test123 (id int not null,name varchar(30) null)
go
5、正常关闭ASE服务器,去掉RUN_file文件中的-T3607,启动后恢复正常;
6、备份master数据库,做一致性检查
dump database master to '/dbdump/master.dmp'
go
dbcc checkdb(master)
go
dbcc checkalloc(master)
go
本文解决方法仅供参考!