介质污染 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 —
对不起,这篇文章暂时关闭评论。