测试PDB迁移从19.4迁移到19.10时,遇到有2500多个同义词synonym 的时候,执行
ORACLE_HOME/rdbms/admin/utlrp.sql
也无法重新编译过去
再次尝试使用
对 owner 为 PUBLIC的 synonym 使用:
alter PUBLIC synonym "object_name" conpile;
对 owner为其他的 synonym使用:
alter synonym "owner"."object_name" compile;
编译时,会报错并把当前连接踢出PDB
检查alert日志发现又报错:
ORA-7445[csyalt()+10xx] xxxx
的报错。去mos上查询,发现在升级之后确实可能出现这个问题,给出的解决方案是
exec dbms_pdb.exec_as_oracle_script('CREATE OR REPLACE PUBLIC SYNONYM <PACKAGE_NAME> FOR SYS.<PACKAGE_NAME>');
对于非PUBLIC的同义词,可以使用:
exec dbms_pdb.exec_as_oracle_script('CREATE OR REPLACE SYNONYM "owner"."object_name" for "owner"."object_name" ');
其实相当于重建了这些同义词
拼接命令:
public 的同义词
select 'exec dbms_pdb.exec_as_oracle_script(''CREATE OR REPLACE PUBLIC SYNONYM "'||OBJECT_NAME||'" FOR SYS."'||OBJECT_NAME||'"'');' from dba_objects
where status='INVALID' and OBJECT_TYPE='SYNONYM' and owner='PUBLIC';
其他用户的同义词
select 'exec dbms_pdb.exec_as_oracle_script(''CREATE OR REPLACE SYNONYM "'||OWNER||'"."'||OBJECT_NAME||'" FOR "'||OWNER||'"."'||OBJECT_NAME||'"'');' from dba_objects
where status='INVALID' and OBJECT_TYPE='SYNONYM' and owner='PUBLIC';
MOS:
编译其他失效对象:
查询失效对象
select owner, object_type, status from dba_objects where status='INVALID';
编译其他失效对象:
alter package "<schema name>"."<package_name>" compile;
alter package "<schema name>"."<package_name>" compile body; 这里注意要加body
alter view "<schema name>"."<view_name>" compile;
alter trigger "<schema>"."<trigger_name>" compile;
...
加引号的原因是,因为有可能有的失效对象是带着路径的
拼接语句:
select 'alter '||OBJECT_TYPE||' '||OWNER||',"'||OBJECT_NAME||'" compile;' from dba_objects where status='INVALID' and OBJECT_TYPE='XXX';
这种语法编译的失效对象类型有:
package ,package body(注意compile后面还要拼接一个body),procedure, type,trigger,view,function,materialized view。
编译type body
exec dbms_pdb.exec_as_oracle_script(''alter type OWNER."OBJECT_NAME" compile body'');
拼接语句:
select 'exec dbms_pdb.exec_as_oracle_script(''alter type '||OWNER||'."'||OBJECT_NAME||'" compile body'');' from dba_object where status='INVALID' and OBJECT_TYPE in ('TYPE BODY');




