Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2583665
  • 博文数量: 323
  • 博客积分: 10211
  • 博客等级: 上将
  • 技术积分: 4934
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-27 14:56
文章分类

全部博文(323)

文章存档

2012年(5)

2011年(3)

2010年(6)

2009年(140)

2008年(169)

分类: Oracle

2009-04-20 11:37:52

在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能起到作用呢?

 



阅读(1174) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-05-06 10:02:09

安装Statspack遇到同样的问题,spdrop后dbms_utility还是无效。。。 在网上搜了很久,好像遇到这个问题的不是很多,奇怪,难道大家9i下都不用statspack么?