《直接更改oracle.exe文件,跳过启动过程中的报错SQL方法》
耿大神群里写的转这供参考记录:
环境说明: pl/sql勒索代码,已删除tab$表数据,导致无法正常打开数据库。 通过GDUL工具已经还原tab$中的旧数据。 数据库打开过程中,由于tab$数据不完整,导致打开失败。
SQL>select?status?from?v$instance;?确认实例处于MOUNT状态。 SQL>ALTER?SYSTEM?SET?"_system_trig_enabled"=FALSE?SCOPE=memory; SQL>ALTER?SYSTEM?SET?job_queue_processes=0?SCOPE=memory; SQL>alter?database?open?upgrade; ORA-01092:?ORACLE?Instance?terminated,?Disconnection?forced. ORA-00913:?值过多
处理过程: 1)打开sql?trace: startup?mount select?*?from?v$diag_info; alter?session?set?sql_trace=true; alter?database?open?upgrade;
2)从.trc中找到报错的SQL: PARSE?ERROR?#644971544:len=70?dep=1?uid=0?oct=2?lid=0?tim=1669154855940?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) ORA-00913:?值过多 ORA-00913:?值过多 上述SQL涉及到SYS_FBA_TRACKEDTABLES表,而该表未能从tab$中恢复。
3)解决办法: 直接使用UltraEdit更改oracle.exe中,上述SQL文本执行所依赖的SQL, 原SQL文本:????????"select?count(OBJ#)?from?SYS_FBA_TRACKEDTABLES?where?bitand(FLAGS,%d)!=0"; 临时新SQL文本:??"select?1?from?dual". 使用新oracle.exe启动实例,Windows环境需要临时把注册表中的ORA_<实例名>_AUTOSTART键改为FALSE。
本案例中,Oracle对应的代码段,判断SYS_FBA_TRACKEDTABLES表中行数,如果得到0,则做insert操作。 改为select?1?from?dual;则返回1,跳过了insert表SYS_FBA_TRACKEDTABLES的操作。
|