在检查后台alert文件的时候,发现了一个job运行错误。
错误信息为:
Errors in file /opt/oracle/admin/tradedb/bdump/tradedb1_j000_10429.trc:
ORA-12012: 自动执行作业 68 出错
ORA-20000: Insufficient privileges to analyze an object in Schema
ORA-06512: 在 "SYS.DBMS_STATS", line 13323
ORA-06512: 在 "SYS.DBMS_STATS", line 13682
ORA-06512: 在 "SYS.DBMS_STATS", line 13760
ORA-06512: 在 "SYS.DBMS_STATS", line 13719
ORA-06512: 在 line 1
从错误信息看,应该是收集统计信息的时候缺少权限。
首先检查出错的JOB:
SQL> SELECT JOB, WHAT FROM DBA_JOBS WHERE JOB = 68;
JOB WHAT
---------- -------------------------------------------------------------------
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
---------- ------------------- -------------------
68 2007-12-14 04:00:00 2007-12-21 12:37:27
这个JOB是用户在收集自己的统计信息,如果是收集其他用户的统计信息出错是比较正常的,而收集自己的统计信息报权限问题,肯定不正常。
而且这个JOB在7天前还顺利执行,现在报错很可能是和最近的数据库修改有关。
根据目前的情况判断,存在两种可能,一种是bug,另一种是由于最近的修改导致的。
通过查询metalink,没有找到相关的bug描述,且大部分类似的错误都和权限有关。看来问题很可能是第二种情况。
如果是第二种情况,那么用户收集自己的统计信息怎么会出现权限不足呢。如果是用户下的表,则用户肯定有权限分析,如果在其他用户下,又不会去收集信息。看来问题应该不是出在表的身上。
再次观察JOB执行的命令,DBMS_STATS.GATHER_SCHEMA_STATS默认是收集索引信息的,那会不会是索引造成的问题。表虽然不会跑到其他用户下,可是索引是可能建立到其他用户下的。
查询索引的OWNER,果然发现问题:
SQL> SELECT DISTINCT OWNER FROM ALL_INDEXES WHERE TABLE_OWNER = 'GPO';
OWNER
------------------------------
SYS
GPO
进一步查询具体错误对象:
SQL> SELECT OWNER, TABLE_NAME, INDEX_NAME
2 FROM ALL_INDEXES
3 WHERE OWNER = 'SYS'
4 AND TABLE_OWNER = 'GPO';
OWNER TABLE_NAME INDEX_NAME
-------------------- ------------------------------ ------------------------------
SYS GPO_ACCREDIT_PRICE IND_GPO_ACC_PRICE_SELLER_ID
查看索引的创建时间,果然是昨天建立的:
SQL> SELECT OBJECT_NAME, CREATED FROM USER_OBJECTS
2 WHERE OBJECT_NAME = 'IND_GPO_ACC_PRICE_SELLER_ID';
OBJECT_NAME CREATED
------------------------------ -------------------
IND_GPO_ACC_PRICE_SELLER_ID 2007-12-20 16:05:35
删除索引后,在GPO用户下重建,问题解决。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69552/,如需转载,请注明出处,否则将追究法律责任。