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

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

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

查找无效对象51Testing软件测试网&[.y6C4L} cS
你可以根据这个查询结果来判断使用下面的哪种方法来编译你数据库里面的无效对象.51Testing软件测试网.gN%j^JY+}

COLUMNobject_name FORMAT A30SELECTowner,object_type,object_name,STATUSFROMdba_objectsWHERESTATUS='INVALID'ORDERBYowner,object_type,object_name;
51Testing软件测试网V`K6~0y6J]


G,lZn]})T]01.手动编译51Testing软件测试网.u H5r7KL)OH
如果无效对象的数量很少,那么你可以逐个编译这些对象.
C.F0G8d/h0B4y s N0如:

|H4ZMk7m'YH0
ALTERPACKAGE my_package COMPILE;ALTERPACKAGE my_package COMPILE BODY;ALTERPROCEDURE my_procedure COMPILE;ALTERFUNCTIONmy_function COMPILE;ALTERTRIGGERmy_trigger COMPILE;ALTERVIEWmy_view COMPILE;

5G/j w {f&vj2x _0你也可以用DBMS_DDL包来编译(但只用于PL/SQL对象,所以你不用它来编译视图等):51Testing软件测试网 Nf0m&J!V!c

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');

[T1Z"r+u*t02.通用脚本
0_ bu8^f)m%B D0在某些情况下你可能有很多无效对象要编译,这样话手工编译就显得效率太低了.51Testing软件测试网2W/Y+]n cL@
在这种情况下你可以些一个通用的脚本生成编译脚本.51Testing软件测试网#KPf.a!G
下面的脚本用来查询无效的package 和package body并生成便宜这些对象的脚本.
"o4J&I;q1Rm-`1G0但是这方法不会考虑ORACLE对象之间的依赖关系.51Testing软件测试网3KUf0J R8Q

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;/

uOtP:Z1| v0F03.使用DBMS_UTILITY.compile_schema
C`8C jm)SD0使用这个包将会编译指定schema下的所有procedures, functions, packages, and triggers.51Testing软件测试网/u.x}z6B;AJ2R*I]
你可以在sqlplus 下使用它,如:
Pdbo$oX0EXEC DBMS_UTILITY.compile_schema(schema => ‘SCOTT’);51Testing软件测试网!X(Vb\e!Ho
4.使用UTL_RECOMP
3S*tr2Exl+N;[6t0UTL_RECOMP包有两个存储过程:RECOMP_SERIAL和RECPMP_PARALLEL
w|1uCX0e(@0从存储过程的名字可以看出一个是非并行,一个是并行方式.51Testing软件测试网]-n| \$Yf b*yI+k0yr[
使用并行方式会加快编译速度,包的定义如下:

EMs5y9{4z:a4f!w051Testing软件测试网 |8^)Fy t\%Tx0r

PROCEDURE RECOMP_SERIAL(51Testing软件测试网j&U8Gx;r'fyR
schema IN VARCHAR2 DEFAULT NULL,
JQ\+s:tWg0flags IN PLS_INTEGER DEFAULT 0);51Testing软件测试网;aH'B\Q!{i I

a8Oi)S%^0PROCEDURE RECOMP_PARALLEL(
#}U0aO&mHV?(l0threads IN PLS_INTEGER DEFAULT NULL,51Testing软件测试网 i!`7x;b&ES
schema IN VARCHAR2 DEFAULT NULL,51Testing软件测试网5{L MM3k6}.?
flags IN PLS_INTEGER DEFAULT 0);
%|I \&h8X@zUt0参数使用方法:
4k^E/hr2up0schema
[gD5e5?e"i0- 想编译的模式,如果为NULL,将编译数据库的所有无效对象.51Testing软件测试网4b!w1O'GV!Z@
threads
r7W%}x Zb6G"B(Tr0- 并行度,如果为NULL,会使用参数job_queue_processes的值.51Testing软件测试网s8{1C4A+`&X#y,Smu
通常threads的值最好和CPU的数量想匹配,以发挥并行的最大优势.51Testing软件测试网-^D p`.HVn tw
flags -
8l0}``+~&bt1b ^0ORACLE内部使用的诊断测试参数.51Testing软件测试网.s$y*JX-m2B
如:

S AH0Zk0
-- 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');

Rt,J3@2E7vJ3`-b)T0UTL_RECOMP包的一些使用限制51Testing软件测试网 Y)ZCmAT'`A:p5[

!b1P(s \&m;Hn6M0(1).并行执行使用的是job队列.当运行并行编译的时候所有job都会被diable直到编译完成.
Zf/A ]|@1b*n h0(2).包必须在sqlplus中以sys用户或者有sysdba权限的用户运行.51Testing软件测试网3}8c(k'V,u Ce%R%`er)K
(3).UTL_RECOMP依赖于DBMS_STANDARD,DBMS_JOB,DBMS_RANDOM51Testing软件测试网7h"Y G0W%ht
(4).如果在运行这个包的时候执行DDL语句可能会导致死锁.51Testing软件测试网?h$G)a`/L\/f

51Testing软件测试网7@ud6iUOw

4.utlrp.sql 和 utlprp.sql
%W8J.dAV%\0utlrp和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:51Testing软件测试网0Ws|2U!W9x
0 - 基于CPU_COUNT参数设置并行度.
#IH7t SIa7X'dR,y01 - 以串行方式编译对象,一次编译一个.51Testing软件测试网,m(PV6i!P$Yv4hc$ER6\
N - 以N个并行度进行编译.51Testing软件测试网"K_0[%Ww`
脚本需要以sys用户或者有sysdba权限的用户来运行51Testing软件测试网.r'e@ggK} z

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar