http://blog.youkuaiyun.com/dayali7802/archive/2008/11/18/3324393.aspx
前2天,pso维护的某省网通的OBS计费系统,由于无法进行export数据导出,报如下错误:
EXP-00056: ORACLE error 31600 encountered
ORA-31600: invalid input value EMIT_SCHEMA for parameter NAME in function SET_TRANSFORM_PARAM
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA_INT", line 3926
ORA-06512: at "SYS.DBMS_METADATA_INT", line 4050
ORA-06512: at "SYS.DBMS_METADATA", line 836
ORA-06512: at line 1
EXP-00000: Export terminated unsuccessfully
pso在没有停业务的情况下,直接打数据库的补丁catpatch.sql,结果打到中间的时候出错ORA-04020,而且,导致业务登陆用户无法登陆进数据库,找到我这里寻找支持。其实,这个补丁升级说明中,明确要停止DML操作,防止数据字典deadlock.
当时诊断确认sys用户能登陆系统,而且,已经连接的session能正常使用,为了不影响现网业务,决定等网上停业务后再做生机。8点左右,停了计费、采集、自服务系统,关闭数据库,然后以migrate方式重起数据库。
当时决定,先解决ORA-04020问题,然后,再打catpatch.sql补丁。
第一步:
SQL> ALTER TRIGGER sys.cdc_alter_ctable_before DISABLE;
SQL> ALTER TRIGGER sys.cdc_create_ctable_after DISABLE;
SQL> ALTER TRIGGER sys.cdc_create_ctable_before DISABLE;
SQL> ALTER TRIGGER sys.cdc_drop_ctable_before DISABLE;
执行这个后,可以在alert_SID.log里看到系统修改信息:
ALTER SYSTEM SET _system_trig_enabled=FALSE SCOPE=MEMORY;
。。。
第二步,执行:
alter package standard compile;
alter package DBMS_standard compile;
因为,后续的$ORACLE_HOME/rdbms/admin/utlrp.sql包要求standard和dbms_standard包正常正常。
最后,执行$ORACLE_HOME/rdbms/admin/utlrp.sql包,该包会重新编译由于升级导致状态不一致的数据字典对象(plsql modules)。
执行完后,查看执行前后
select status,count(*) from dba_objects group by status
无效状态的对象由执行前的2000多降低到14个。
至此,执行alter system disable restricted session后,计费系统的用户已经能正常登陆了。
此后,开始在migrate模式下,打catpatch.sql补丁,一切正常。
最后,说说执行utlrp.sql时的死循环问题。
在对公司测试数据库进行catpatch.sql升级时,升级完成后有681个invalid objects,执行utlrp.sql重新编译invalid plsql modules时,发现oracle cpu占用一直在25%左右,执行结束不了。查看该进行执行的SQL,发现定期的在重新编译:
alter view xdb.resource_view compile;
基本确定是它的问题导致死循环,但死循环的原因不清楚。
查找了一下,xdb是与xml相关的,并且,在$ORACLE_HOME/rdbms/catqm.sql可以重新来构建该用户的所有对象。所以,删除了该用户,并重新执行utlrp.sql,2分钟左右完成。重新执行catqm.sql构建了xdb用户对象。
所有完成后,查看无效对象降低到了21个。