我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

JOB调用DBMS_STATS包出错的诊断

上一篇 / 下一篇  2007-12-21 00:00:00 / 个人分类:ORACLE

在检查后台alert文件的时候,发现了一个job运行错误。


'_*P|)E*t!oj0

错误信息为:

Errors in file /opt/oracle/admin/tradedb/bdump/tradedb1_j000_10429.trc:ITPUB个人空间yWER }V
ORA-12012:
自动执行作业 68 出错
|Hj;K,K0ORA-20000: Insufficient privileges to analyze an object in Schema
M0VT4_i$ymaS4k O0ORA-06512:
"SYS.DBMS_STATS", line 13323
"[ J#L R:uh0ORA-06512:
"SYS.DBMS_STATS", line 13682ITPUB个人空间1g7@_ `q%L2S
ORA-06512:
"SYS.DBMS_STATS", line 13760
o O?O-},G0ORA-06512:
"SYS.DBMS_STATS", line 13719
#P5[z*Zg?8~9X0ORA-06512:
line 1

从错误信息看,应该是收集统计信息的时候缺少权限。

首先检查出错的JOB

SQL> SELECT JOB, WHAT FROM DBA_JOBS WHERE JOB = 68;

JOB WHATITPUB个人空间SL kjB)\%g
---------- -------------------------------------------------------------------
9G's)c4w j0 68 DBMS_STATS.GATHER_SCHEMA_STATS(USER, METHOD_OPT => 'FOR ALL INDEXED COLUMNS');

SQL> SELECT JOB, LAST_DATE, NEXT_DATE FROM DBA_JOBS WHERE JOB = 68;

JOB LAST_DATE NEXT_DATE
0h z1SDo(g C6q#K0---------- ------------------- -------------------ITPUB个人空间f;a CC[
68 2007-12-14 04:00:00 2007-12-21 12:37:27

这个JOB是用户在收集自己的统计信息,如果是收集其他用户的统计信息出错是比较正常的,而收集自己的统计信息报权限问题,肯定不正常。

而且这个JOB7天前还顺利执行,现在报错很可能是和最近的数据库修改有关。

根据目前的情况判断,存在两种可能,一种是bug,另一种是由于最近的修改导致的。

通过查询metalink,没有找到相关的bug描述,且大部分类似的错误都和权限有关。看来问题很可能是第二种情况。

如果是第二种情况,那么用户收集自己的统计信息怎么会出现权限不足呢。如果是用户下的表,则用户肯定有权限分析,如果在其他用户下,又不会去收集信息。看来问题应该不是出在表的身上。

再次观察JOB执行的命令,DBMS_STATS.GATHER_SCHEMA_STATS默认是收集索引信息的,那会不会是索引造成的问题。表虽然不会跑到其他用户下,可是索引是可能建立到其他用户下的。

查询索引的OWNER,果然发现问题:

SQL> SELECT DISTINCT OWNER FROM ALL_INDEXES WHERE TABLE_OWNER = 'GPO';

OWNER
ls:_0h1a] x0\b0------------------------------
o| c4M5hVuO0SYS
`&B9Z?e7D!l4J0GPO

进一步查询具体错误对象:

SQL> SELECT OWNER, TABLE_NAME, INDEX_NAME
f2bl.x&QC7S0 2 FROM ALL_INDEXES
R5s&[ C5\0 3 WHERE OWNER = 'SYS'ITPUB个人空间 PE%Y4iS)M5v
4 AND TABLE_OWNER = 'GPO';

OWNER TABLE_NAME INDEX_NAME
5M{"hmm}R/X0-------------------- ------------------------------ ------------------------------
o0a| i8v!pA0SYS GPO_ACCREDIT_PRICE IND_GPO_ACC_PRICE_SELLER_ID

查看索引的创建时间,果然是昨天建立的:

SQL> SELECT OBJECT_NAME, CREATED FROM USER_OBJECTSITPUB个人空间mi I,ySPG
2 WHERE OBJECT_NAME = 'IND_GPO_ACC_PRICE_SELLER_ID';

OBJECT_NAME CREATEDITPUB个人空间QV3gUAo\)w\
------------------------------ -------------------
SE$tAUpq0IND_GPO_ACC_PRICE_SELLER_ID 2007-12-20 16:05:35

删除索引后,在GPO用户下重建,问题解决。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar