在9i中安装statspack后,你是否注意到invalid状态的对象大大的增加?也许你认为跑一下utlrp.sql就OK了,但往往这个脚本并不起到什么作用。今天我在9i的平台做了一下测试,发现确实如此,但幸运的是运行utlrp.sql能消除invalid对象。
SQL> select count(*) from dba_objects where status='INVALID';
COUNT(*)
----------
5
SQL> @/oracle/ora92/rdbms/admin/utlrp.sql
PL/SQL procedure successfully completed.
Table created.
Table created.
Table created.
Index created.
Table created.
Table created.
View created.
View created.
Package created.
No errors.
Package body created.
No errors.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
SQL> select count(*) from dba_objects where status='INVALID';
COUNT(*)
----------
5
SQL> select * from dba_objects where status='INVALID';
OWNER OBJECT_NAME
------------------------------ -----------------------------
SYSTEM EPMFTVALIDATORPK
SYSTEM EPMFTVALIDATORPK
SYSTEM EPMSUPPORTINGDATAPK
SYSTEM EPMSUPPORTINGDATAPK
SYSTEM TABLE_OF_TABLE_OF_NUMBER
--编译后还是5个,可能是用户写的对象,先不管它。
--安装完statspack后,再来看结果。
SQL> SELECT * FROM DBA_OBJECTS WHERE STATUS='INVALID';
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS TEMPORARY GENERATED SECONDARY
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ---------- -------------- ------------------ ----------- ------------- ------------------- ------- --------- --------- ---------
SYS DBMS_AQADM_SYS 3799 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:16:32 INVALID N N N
SYS DBMS_IREFRESH 4078 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:16:45 INVALID N N N
SYS DBMS_JOB 3458 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:16:08 INVALID N N N
SYS DBMS_PCLXUTIL 3430 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:16:05 INVALID N N N
SYS DBMS_PRVTAQIP 3761 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:16:22 INVALID N N N
SYS DBMS_SNAPSHOT 4080 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:19:26 INVALID N N N
SYS DBMS_STATS 3462 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:16:11 INVALID N N N
SYS DBMS_UTILITY 3425 PACKAGE BODY 2006-4-16 1 2006-8-15 10: 2006-08-15:10:16:05 INVALID N N N
SYS UTL_RECOMP 6211 PACKAGE BODY 2006-4-16 1 2009-4-20 10: 2009-04-20:10:37:45 INVALID N N N
SYSTEM EPMFTVALIDATORPK 8986 PACKAGE 2006-4-18 7 2006-9-19 11: 2006-04-18:08:00:05 INVALID N N N
SYSTEM EPMFTVALIDATORPK 8987 PACKAGE BODY 2006-4-18 7 2006-9-19 11: 2006-04-18:08:00:05 INVALID N N N
SYSTEM EPMSUPPORTINGDATAPK 8961 PACKAGE 2006-4-18 7 2006-8-24 14: 2006-04-18:08:00:07 INVALID N N N
SYSTEM EPMSUPPORTINGDATAPK 8966 PACKAGE BODY 2006-4-18 7 2006-8-24 14: 2006-04-18:08:00:07 INVALID N N N
SYSTEM TABLE_OF_TABLE_OF_NUMBER 8979 TYPE 2006-4-18 7 2006-8-24 12: 2006-04-18:08:00:05 INVALID N N N
14 rows selected
--多出了9个invalid的对象。
在itpub上找到这样一篇文章是这样描述的:()
在老的Oracle版本中(10g前),运行spcreate.sql脚本可能会引起上百个对象无效,不仅仅是你自己的对象,还包括Oracle的对象,你可能会认为这个问题好解决,只需要运行utlrp.sql重新编译所有对象就可以了。如果你坐在那里等待修复脚本运行,你会发现什么事情都没有发生,为什么会这样?因为安装STATSPACK间接让一个对象无效,这个对象就是DBMS_UTILITY包主体。因为首先重新编译的是Oracle的对象,但它不是,你能做的只有手动编译其它对象,但这个包主体的状态仍然是无效的。
你是否认为Oracle提供的内置脚本肯定不会有问题,即使变为无效状态,也可以重新运行它,并不会产生什么不良后果,对系统也不会有什么大的影响?如果你就是这种想法,那赶紧纠正这种想法,安装STATSPACK时,是什么引起这些乱七八糟的事情的?运行spcreate.sql时会调用其它脚本,其中一个就是spcusr.sql脚本,这个脚本又调用”,从名字上猜测出它是干什么的了吗?对了,它就是安装(至少会尝试)内置的DBMS_JOB,如果此时你的系统上恰好有一个DBMS_JOB,那真正发生DBMS_JOB时究竟该使用哪一个呢?
如何来解决这个问题呢?STATSPACK已经安装成功了,在rdbms目录下的文档、发行注记、类REAME文件(spdoc.txt)中也没有任何关于dbmsjob引起问题的描述,至少最近还没有,即使是翻遍STATSPACK完全参考也找不到丁点这方面的信息。现在有一个笔记更新了(149113.1,“安装和配置STATSPACK[sic]包”),它里面推荐注释掉spcusr.sql脚本中调用dbmsjob的代码。在2002年的一个bug中也有提到,但在这个文档中却没有包括,直到六年后才包括进来了。
在几年前发布的Oracle 10g中的spcusr,调用dbmsjob的代码被移除了,更多的是使用DBMS_JOB了。总的说来,这是Oracle历史上一个非常大的败笔,它从来就没有清晰地对比过dbmsjob和DBMS_UTILITY。
--删除statspack然后修改spcusr.sql脚本,注释@@dbmsjob。再次安装statspack,发现这次invalid对象并没有增加。查看文中提到的149113.1这篇文章,oracle确实已经将dbmsjob引起的问题作出了描述。
Installing STATSPACK invalidates dbms_utility:
==============================================
If dbms_job is already installed, then comment out the @@dbmsjob line in spcusr.sql.
--继续查看10g版本,@@dbmsjob这一行已经没有了。到现在我们至少知道了怎样在9i中避免这样的问题。现在还有个问题不是很清楚,为什么我这里运行utlrp.sql能起到作用呢?
阅读(1229) | 评论(1) | 转发(0) |