Oracle非法数据库对象引起的错误及解决

铅笔人weishe

铅笔人weishe

2016-02-19 19:47

有了下面这个Oracle非法数据库对象引起的错误及解决教程,不懂Oracle非法数据库对象引起的错误及解决的也能装懂了,赶紧get起来装逼一下吧!
Oracle 数据库使用的时间越长,操作数据库的人越多,可能会遇到一些非法数据库对象引起的错误。
  
  例如:
  
  按用户 exp 时会报错(oracle10G)
  
  . exporting synonyms
  EXP-00008: ORACLE error 3113 encountered
  ORA-03113: end-of-file on communication channel
  EXP-00000: Export terminated unsuccessfully
  
  ORACLE8i 里面的的exp错误 ORA-00980
  
  跟踪文件里的错误:
  
  ORA-07445: exception encountered: core dump [joe_well_known_internal()+39] [SIGSEGV]
  [Address not mapped to object] [0x1268D5C] [] []
  ......
  
  SELECT SYNNAM, DBMS_JAVA.LONGNAME(SYNNAM), DBMS_JAVA.LONGNAME(SYNTAB),TABOWN,
  TABNODE, PUBLIC$, SYNOWN, SYNOWNID, TABOWNID, SYNOBJNO
  FROM SYS.EXU9SYNU ORDER BY SYNTIME;
  
  我的经验是这些数据库的用户下很可能有非法数据库对象。删除不合法的数据对象,就可以了。
  
  一般情况下生成当前用户下重编译非法数据库对象的SQL语句:
  
  set pages 500;
  set lines 200;
  set trims on;
  set heading off;
  spool /tmp/1.sql;
  select 'alter '||object_type||' '||object_name||'; compile' from user_objects where status='INVALID';
  spool off;
  @/tmp/1.sql;
  
  但也有例外的情况:
  
  当原始的表被drop掉后,依据它创建的同义词就变得不能访问了。中国公务网 2005-9-7 14:38:32
  
  原始的表重建以后,同义词仍然不可以访问。
  
  但在user_objects里面的status状态是'VALID',却不是'INVALID'。
  
  这需要我们把它们找出来,运行查询同义词表结构的语句:
  
  spool /tmp/1.sql;
  select 'desc '||synonym_name||';' from user_synonyms;
  spool off;
  @/tmp/1.sql;
  
  出错的同义词, 一定要先彻底删除掉,再重建创建同义词。
  
  drop synonym &synonym_name;
  
  create synonym &synonym_name for &owner.&table_name;
  
  重编译后,仍然出错的数据对象,经开发人员同意后,我们还可以选择drop它们。
  
  我还遇到过一次在drop非法数据库对象的时候,不加双引号之前,提示数据对象不存在。
  
  一定要在数据库对象加上双引号就可以删掉了。(这可能跟创建数据对象所用的辅助性工具有关)
  
  例如:
  
  drop table scott."emp" cascade constraints;
  
  drop trigger scott."trigger_name";
  
  如果所有的非法数据对象都没有了,还会出现上面的错误。
  
  可能是jvm(java虚拟环境)的问题。DBMS_JAVA.LONGNAME()过程函数一执行,就会报错。
  
  还有一个解决办法:重建sys用户下跟同义词有关的视图,让它找不到记录
  
  drop view EXU9SYNU;
  
  create view EXU9SYNU as
  SELECT "SYNNAM","SYNNAM2","SYNTAB","TABOWN","TABNODE","PUBLIC$","SYNOWN",
  "SYNOWNID","TABOWNID","SYNOBJNO","SYNTIME"
  FROM  sys.exu9syn
  -- WHERE  synownid = UID; (原来的视图创建方法)
  WHERE  0=1;
  
  grant select on sys.EXU9SYNU to public;
  
  这样一来按用户导出数据时,可以跳过同义词部分,继续完成后面的工作。
展开更多 50%)
分享

猜你喜欢

Oracle非法数据库对象引起的错误及解决

编程语言 网络编程
Oracle非法数据库对象引起的错误及解决

Oracle数据库数据对象分析

电脑网络
Oracle数据库数据对象分析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Oracle数据库操作常见错误及解决方案

编程语言 网络编程
Oracle数据库操作常见错误及解决方案

Oracle数据库数据对象分析(下)

编程语言 网络编程
Oracle数据库数据对象分析(下)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Oracle数据库数据对象分析(中)

编程语言 网络编程
Oracle数据库数据对象分析(中)

Oracle数据库数据对象分析(上)

编程语言 网络编程
Oracle数据库数据对象分析(上)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

18岁不是花的年纪么,为什么都充满的相亲.

18岁不是花的年纪么,为什么都充满的相亲.

Oracle中自增字段的两种方法的比较(Trigger和Sequence)

Oracle中自增字段的两种方法的比较(Trigger和Sequence)
下拉加载更多内容 ↓