如何重编译ORACLE数据库的无效对象

上一篇 / 下一篇  2008-11-22 18:17:58 / 个人分类:Oracle

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
51Testing软件测试网]]cO|}3HC8ks }

查找无效对象
dKj m/i`5_0你可以根据这个查询结果来判断使用下面的哪种方法来编译你数据库里面的无效对象.51Testing软件测试网bn#So)D z#w"mQI

COLUMNobject_name FORMAT A30SELECTowner,object_type,object_name,STATUSFROMdba_objectsWHERESTATUS='INVALID'ORDERBYowner,object_type,object_name;
51Testing软件测试网 {$Su5l#GK1q


0X }%P[5c"Ww+P/f01.手动编译51Testing软件测试网#^,DVI}5N!C
如果无效对象的数量很少,那么你可以逐个编译这些对象.
\T;r"pr0如:

O,C'S?#v0
ALTERPACKAGE my_package COMPILE;ALTERPACKAGE my_package COMPILE BODY;ALTERPROCEDURE my_procedure COMPILE;ALTERFUNCTIONmy_function COMPILE;ALTERTRIGGERmy_trigger COMPILE;ALTERVIEWmy_view COMPILE;
51Testing软件测试网GsCB`/ax

你也可以用DBMS_DDL包来编译(但只用于PL/SQL对象,所以你不用它来编译视图等):

'Fq? VEz&c9o0
EXEC DBMS_DDL('PACKAGE','MY_SCHEMA','MY_PACKAGE'); 
EXEC DBMS_DDL('PACKAGE BODY','MY_SCHEMA','MY_PACKAGE'); 
EXEC DBMS_DDL('PROCEDURE','MY_SCHEMA','MY_PROCEDURE'); 
EXEC DBMS_DDL('FUNCTION','MY_SCHEMA','MY_FUNCTION'); 
EXEC DBMS_DDL('TRIGGER','MY_SCHEMA','MY_TRIGGER');
51Testing软件测试网]W'h?4[%UB#Y

2.通用脚本51Testing软件测试网1j(Gk_@B
在某些情况下你可能有很多无效对象要编译,这样话手工编译就显得效率太低了.51Testing软件测试网 K]:JQw b
在这种情况下你可以些一个通用的脚本生成编译脚本.51Testing软件测试网4vw2Lx ]6mUG
下面的脚本用来查询无效的package 和package body并生成便宜这些对象的脚本.
Mf)~.F*qS)YaZ]0但是这方法不会考虑ORACLE对象之间的依赖关系.

&[!ll.G V'y7u-l3M0
SETSERVEROUTPUTONSIZE1000000BEGINFORcur_recIN(SELECTowner,object_name,object_type,DECODE(object_type,'PACKAGE',1,'PACKAGE BODY',2,2)ASrecompile_orderFROMdba_objectsWHEREobject_typeIN('PACKAGE','PACKAGE BODY')ANDSTATUS!='VALID'ORDERBY4)LOOP 
BEGINIFcur_rec.object_type='PACKAGE'THEN 
EXECUTE IMMEDIATE'ALTER '||cur_rec.object_type||' "'||cur_rec.owner||'"."'||cur_rec.object_name||'" COMPILE'; 
ElSE 
EXECUTE IMMEDIATE'ALTER PACKAGE "'||cur_rec.owner||'"."'||cur_rec.object_name||'" COMPILE BODY'; 
ENDIF; 
EXCEPTION 
WHEN OTHERS THEN 
DBMS_OUTPUT.put_line(cur_rec.object_type||' : '||cur_rec.owner||' : '||cur_rec.object_name); 
END; 
END LOOP; 
END;/
51Testing软件测试网]r!d%F&L

3.使用DBMS_UTILITY.compile_schema
[w,y^ Y:h0使用这个包将会编译指定schema下的所有procedures, functions, packages, and triggers.
b!`2g$da N.`P'o0你可以在sqlplus 下使用它,如:
[,y B6w(]yv8y"F0EXEC DBMS_UTILITY.compile_schema(schema => ‘SCOTT’);51Testing软件测试网8h,R u_y:b[
4.使用UTL_RECOMP51Testing软件测试网1Rw1SE0K^+r(t\
UTL_RECOMP包有两个存储过程:RECOMP_SERIAL和RECPMP_PARALLEL51Testing软件测试网"h_)d(_/Rl
从存储过程的名字可以看出一个是非并行,一个是并行方式.51Testing软件测试网;gQ ]X*I%U{5B
使用并行方式会加快编译速度,包的定义如下:51Testing软件测试网2F3e@~R:AN } J

M2ah v:D0PROCEDURE RECOMP_SERIAL(51Testing软件测试网_(oz8I'q
schema IN VARCHAR2 DEFAULT NULL,51Testing软件测试网^w+u1Yqk"q5w
flags IN PLS_INTEGER DEFAULT 0);51Testing软件测试网 q"YZOSy:}

51Testing软件测试网Q ` g^9X

PROCEDURE RECOMP_PARALLEL(51Testing软件测试网#Fv"A7K$I)QUF
threads IN PLS_INTEGER DEFAULT NULL,
;\ZV8u_%a i${0schema IN VARCHAR2 DEFAULT NULL,51Testing软件测试网n9WYe$cDRM
flags IN PLS_INTEGER DEFAULT 0);
\"\)eXobG2A9M3{c0参数使用方法:
L7ay{0h4Y&H#X:k0schema51Testing软件测试网]Ew5aT+i7Y
- 想编译的模式,如果为NULL,将编译数据库的所有无效对象.
n*DQ7cZ5O-B5l9Wc0threads
/jcP0as;YB0- 并行度,如果为NULL,会使用参数job_queue_processes的值.51Testing软件测试网4{:fQd!Q ?v'|
通常threads的值最好和CPU的数量想匹配,以发挥并行的最大优势.51Testing软件测试网T]Jy_ V
flags -51Testing软件测试网7S Vmn#w V;JB&W+G
ORACLE内部使用的诊断测试参数.51Testing软件测试网)~*pB8z,o@&ccH
如:

wvb/?Z:K0
-- Schema level.EXEC UTL_RECOMP.recomp_serial('SCOTT'); 
EXEC UTL_RECOMP.recomp_parallel(4,'SCOTT'); 
 -- Database level.EXEC UTL_RECOMP.recomp_serial(); 
EXEC UTL_RECOMP.recomp_parallel(4); 
 -- Using job_queue_processes value.EXEC UTL_RECOMP.recomp_parallel(); 
EXEC UTL_RECOMP.recomp_parallel(NULL,'SCOTT');
51Testing软件测试网/hB%J#f:b+Y

UTL_RECOMP包的一些使用限制51Testing软件测试网Mc/{p x

51Testing软件测试网iD+H1U5ETU

(1).并行执行使用的是job队列.当运行并行编译的时候所有job都会被diable直到编译完成.51Testing软件测试网w3o0I&~;\/Nxe
(2).包必须在sqlplus中以sys用户或者有sysdba权限的用户运行.
QRh7Nkb'@)j0(3).UTL_RECOMP依赖于DBMS_STANDARD,DBMS_JOB,DBMS_RANDOM
ZP ^ uipG5Q~M7n2O0(4).如果在运行这个包的时候执行DDL语句可能会导致死锁.

~;go6vf051Testing软件测试网 b!Sc1HV

4.utlrp.sql 和 utlprp.sql
&^#ENH2CS#ZL2L-y0utlrp和utlprp脚本可以用来重编译数据库的所有无效对象.通常我们会在Oracle的升级指导中看到这个脚本,Oracle强烈推荐在migration/upgrade/downgrade之后,通过运行此脚本编译失效对象.脚本位于$ORACLE_HOME/rdbms/admin目录.你可以看到utlrp.sql只是调用utlprp.sql,utlrp.sql在调用utlprp.sql的时候会传递给它一个参数,默认为0,这个参数其实就是并行度,其实utlprp.sql调用的是utl_recomp.recomp_parallel:
t:v_|J KIJ00 - 基于CPU_COUNT参数设置并行度.
!x~u yA01 - 以串行方式编译对象,一次编译一个.
6nXQ3}m]:La?0N - 以N个并行度进行编译.
E*I:m N Dx+HJ z6\'r!kh0脚本需要以sys用户或者有sysdba权限的用户来运行

Ha6I6f3d L(Rs0

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar