系统 :aix 53
版本: 10.2.0.3
Errors in file /oracle/app/oracle/admin/sxsi/udump/sxsi_ora_909628.trc:
ORA-00600: 内部错误代码, 参数: [ktecgetsh-inc], [1], [], [], [], [], [], []
处理过程:
3.1查看数据库等待事件:
确定当前session没有任何等待事件 SQL> select sid from v$mystat where rowed <=1; SQL> select sid,event,p1,p1text from v$session |
3.3定位出现问题的ACA的表:
SQL> select * from tab where tname like '%ACA6%'; TNAME TABTYPE CLUSTERID —————————— ——- ———- ACA6 TABLE ACA60701 TABLE ACA6A TABLE ACA6B TABLE ACA6C TABLE ACA6MERGE TABLE ACA6MOVE TABLE ACA6_BACKUP TABLE ACA6_CW TABLE ACA6_DEF TABLE ACA6_TEMP TABLE TNAME TABTYPE CLUSTERID —————————— ——- ———- ACA6_TZ TABLE F_ACA6 TABLE F_ACA6_1201 TABLE F_ACA6_BAK_20100629 TABLE MLOG$_ACA6 TABLE ZZZ_ACA6_12 TABLE ZZZ_ACA6_DB TABLE ZZZ_ACA6_YL TABLE |
找出ACA6表
3.4 通过视图dba_indexes查看ACA6表上的索引
SQL> select INDEX_NAME,INDEX_TYPE from dba_indexes where table_name = 'ACA6'; INDEX_NAME INDEX_TYPE —————————— ————————— IDX_ACA6_AAC001_AAE140 NORMAL PK_ACA6 NORMAL IDX_ACA6_AAC001 NORMAL IDX_ACA6_AAE063 NORMAL IDX_ACA6_AAE074 NORMAL IDX_ACA6_AAB001 NORMAL IDX_ACA6_EAE038 NORMAL IDX_ACA6_AAE002 NORMAL IDX_ACA6_PRSENO NORMAL PK_ACA6 NORMAL IDX_ACA6_PRSENO NORMAL INDEX_NAME INDEX_TYPE —————————— ————————— PK_ACA6 NORMAL IDX_ACA6_AAC001 NORMAL IDX_ACA6_AAE002 NORMAL IDX_ACA6_AAE063 NORMAL IDX_ACA6_AAE074 NORMAL IDX_ACA6_EAE038 NORMAL IDX_ACA6_PRSENO NORMAL 已选择18行。 |
由上面的查询可以看出此表有18个索引,如果全部重建,那么需要的时间需要比较长,这里我们根据错误以及内部原理推出错误只局限在出现错误的对应的分区表上的索引,所以只要找出对应的分区表上的索引即可。
3.5 根据客户提供的aca6表的aca6_6分区进行拆分,那么报错也是这个分区表:
执行 SQL>Select * from aca6 partition(aca6_1) where ….; … SQL>select * from aca6 partition(aca6_6) where aae002='125485532354'; ORA-10632:invalid rowid |
得出的是 分区表aca6 1-5partition都是正常的,只有执行拆分操作的6号分区出现问题,根据查询到的ace002索引为此分区aae002字段上的索引,吕与我采用CATS尝试创建该表备份,并重建ACE002索引。
1.6 通过下面语句执行cats以及重建
Create table aca6_6bak as select * from aca6 partition(aca6_6);
报错:ora 10632.
终止业务服务器,尝试重建索引:
select dbms_metadata.get_ddl('index','IDX_ACA6_AAE002') from dual;
然后将结果粘贴执行,
报错:ora 10632
发现事故非常严重,已经无法访问表,无法用cats和重建索引方式解决这个问题,逐建议采用备份恢复,但是最后发现备份恢复不出
select /*+ parallel(aca6,2) */ count(*) from aca6 partition(aca6_6); 3725620 rows ora – 10632:invaild rowid |
这里标明,表数据还能扫描,还没全坏继续执行
SQL> select * from aca6 partition(aca6_6) where rownum <= 10000;
观察等待事件
SQL> select sid,event,p1,p2 from v$session where sid in (select sid from v$mystat where
Rownum <=1);
SID EVENT
———- —————————————————————-
P1 P2
———- ———-
137 SQL*Net message to client
1650815232 1
…….
在这里结果标明扫描并没有从磁盘里读取数据块,任何的select的操作都不可能没有等待事件,向磁盘读取数据过程都需要一定的时间,并且会有相关的IO事件在event中显示,
这里分析:数据库并没有向硬盘读取数据,表的数据在硬盘中,数据是正常的,可能是由于这个bug引起内存错误造成oracle无法正确去读取硬盘数据块。
解决办法:
将共享池刷新一遍,尝试cats以及index rebuild
操作:
SQL >Alter system flush shared_pool;
SQL >Alter system flush buffer_cache;
然后执行CATS以及INDEX REBUILT成功。备有aca6_6bak一份,大约5G数据