Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

21

积分

0

好友

5

主题
1#
发表于 2012-6-14 12:43:07 | 查看: 15653| 回复: 12
这边维护的一个11.1.0.7 on HP11.31的双节点RAC库,alert日志最近每天都有GATHER_STATS_JOB的错误,开始以为是个临时用的表分析时没了,后来发现不是。日志如下:
Wed Jun 13 21:08:49 2012
WARNING: inbound connection timed out (ORA-3136)
Wed Jun 13 22:00:00 2012
Setting Resource Manager plan SCHEDULER[0x2C55]:DEFAULT_MAINTENANCE_PLAN via scheduler window
Setting Resource Manager plan DEFAULT_MAINTENANCE_PLAN via parameter
Wed Jun 13 22:00:05 2012
Begin automatic SQL Tuning Advisor run for special tuning task  "SYS_AUTO_SQL_TUNING_TASK"
Wed Jun 13 22:14:43 2012
GATHER_STATS_JOB encountered errors.  Check the trace file.
Errors in file /oracle/app/diag/rdbms/kfdb/kfdb1/trace/kfdb1_j001_29798.trc:
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P01_1, insufficient privileges or does not exist
Wed Jun 13 22:17:59 2012
Thread 1 advanced to log sequence 1680 (LGWR switch)
  Current log# 2 seq# 1680 mem# 0: /dev/dbdata1/rlvredo_121
  Current log# 2 seq# 1680 mem# 1: /dev/dbdata1/rlvredo_122
  Current log# 2 seq# 1680 mem# 2: /dev/dbdata2/rlvredo_221
  Current log# 2 seq# 1680 mem# 3: /dev/dbdata2/rlvredo_222
Wed Jun 13 22:21:23 2012
End automatic SQL Tuning Advisor run for special tuning task  "SYS_AUTO_SQL_TUNING_TASK"
Thu Jun 14 02:00:00 2012
Clearing Resource Manager plan via parameter
Thu Jun 14 08:32:21 2012
Global Enqueue Services Deadlock detected. More info in file
/oracle/app/diag/rdbms/kfdb/kfdb1/trace/kfdb1_lmd0_4485.trc.
$ more /oracle/app/diag/rdbms/kfdb/kfdb1/trace/kfdb1_j001_29798.trc
Trace file /oracle/app/diag/rdbms/kfdb/kfdb1/trace/kfdb1_j001_29798.trc
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
ORACLE_HOME = /oracle/app/oracle/product/11.1.0/db_1
System name:    HP-UX
Node name:      kfora1
Release:        B.11.31
Version:        U
Machine:        ia64
Instance name: kfdb1
Redo thread mounted by this instance: 1
Oracle process number: 224
Unix process pid: 29798, image: oracle@kfora1 (J001)




*** 2012-06-13 22:14:43.189
*** SESSION ID:(2165.65414) 2012-06-13 22:14:43.189
*** CLIENT ID:() 2012-06-13 22:14:43.189
*** SERVICE NAME:(SYS$USERS) 2012-06-13 22:14:43.189
*** MODULE NAME:(DBMS_SCHEDULER) 2012-06-13 22:14:43.189
*** ACTION NAME:(ORA$AT_OS_OPT_SY_6767) 2012-06-13 22:14:43.189

ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P01_1, insufficient privileges or does not exist


*** 2012-06-13 22:14:43.195
GATHER_STATS_JOB: GATHER_TABLE_STATS('"ICD"','"TCHAT"','"P01_1"', ...)
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P01_1, insufficient privileges or does not exist


*** 2012-06-13 22:14:43.449
GATHER_STATS_JOB: GATHER_TABLE_STATS('"ICD"','"TCHAT"','"P01_2"', ...)
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P01_2, insufficient privileges or does not exist


*** 2012-06-13 22:14:43.691
GATHER_STATS_JOB: GATHER_TABLE_STATS('"ICD"','"TCHAT"','"P01_3"', ...)
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P01_3, insufficient privileges or does not exist


*** 2012-06-13 22:14:43.947
GATHER_STATS_JOB: GATHER_TABLE_STATS('"ICD"','"TCHAT"','"P02_1"', ...)
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P02_1, insufficient privileges or does not exist


*** 2012-06-13 22:14:44.200
GATHER_STATS_JOB: GATHER_TABLE_STATS('"ICD"','"TCHAT"','"P02_2"', ...)
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P02_2, insufficient privileges or does not exist



于是我手工对这个分区表做了一下分析,还是报错
$ sqlplus / as sysdba                                                                                                           


SQL*Plus: Release 11.1.0.7.0 - Production on Thu Jun 14 12:05:52 2012


Copyright (c) 1982, 2008, Oracle.  All rights reserved.




Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options


SQL> desc icd.tchat
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
PARTID                                             CHAR(4)
CCID                                      NOT NULL NUMBER(9)
VDNID                                     NOT NULL NUMBER(5)
CALLID                                    NOT NULL VARCHAR2(25)
CHATID                                    NOT NULL NUMBER(30)
SENDER                                             VARCHAR2(50)
RECEIVER                                           VARCHAR2(50)
SENDTIME                                           DATE
CHATDATA                                           CLOB
CLIENTFLAG                                         VARCHAR2(50)
ISATTACH                                           CHAR(1)
UVID                                               VARCHAR2(100)
SENDERTYPE                                         NUMBER(3)
RECEIVERTYPE                                       NUMBER(3)
RESERVE1                                           VARCHAR2(50)
RESERVE2                                           VARCHAR2(50)
RESERVE3                                           VARCHAR2(50)
RESERVE4                                           VARCHAR2(50)
RESERVE5                                           VARCHAR2(50)






SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('ICD','TCHAT');
BEGIN DBMS_STATS.GATHER_TABLE_STATS('ICD','TCHAT'); END;


*
ERROR at line 1:
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT", insufficient privileges or
does not exist
ORA-06512: at "SYS.DBMS_STATS", line 18397
ORA-06512: at "SYS.DBMS_STATS", line 18429
ORA-06512: at line 1




SQL> exec sys.dbms_stats.gather_table_stats ( ownname => 'ICD',tabname => 'TCHAT',partname => 'P01_1',granularity => 'DEFAULT',cascade => true,estimate_percent => 1, method_opt => 'FOR ALL COLUMNS SIZE 1');


BEGIN sys.dbms_stats.gather_table_stats ( ownname => 'ICD',tabname => 'TCHAT',partname => 'P01_1',granularity => 'DEFAULT',cascade => true,estimate_percent => 1, method_opt => 'FOR ALL COLUMNS SIZE 1'); END;


*
ERROR at line 1:
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT" P01_1, insufficient privileges
or does not exist
ORA-06512: at "SYS.DBMS_STATS", line 18397
ORA-06512: at "SYS.DBMS_STATS", line 18429
ORA-06512: at line 1




SQL> SQL>

请大家帮分析一下什么原因,谢谢!
附表结构

sql.txt

23.5 KB, 下载次数: 1195

13#
发表于 2012-6-19 09:35:42
确实是权限丢失了,tchat表重建了之后就没问题了 ,然后自动收集job又报了另一个同样情况表的ORA-20000错误

回复 只看该作者 道具 举报

12#
发表于 2012-6-18 11:00:40
试了一下 不是建表小写的那个情况。
我问了一下应用这个表的情况,这个表是前几天imp导入创建的,我现在怀疑是imp有什么bug导致权限缺失

回复 只看该作者 道具 举报

11#
发表于 2012-6-17 22:29:22
查了一下 metalink 发现 也可能确实由于SYS 用户权限缺失导致该问题,建议你检查 SYS的权限


ORA-20000: Insufficient Privileges On Dbms_stats

Applies to:

Oracle Server - Enterprise Edition - Version: 10.2.0.1
This problem can occur on any platform.
Symptoms

Automated Gather Stats Job fails with errors :

ORA-12012: error on auto execute of job 8951
ORA-20000: ORA-20000: Insufficient privileges
ORA-06512: at "SYS.DBMS_STATS", line 2175

Related queries to role-privileges returned :

SQL> conn / as sysdba

    select * from ( select r.privilege
    from user_role_privs u,role_sys_privs r
    where u.granted_role=r.role
    union all
    select privilege
    from user_sys_privs
    )
    where privilege = 'ANALYZE ANY'
      and rownum < 2;
   
    PRIVILEGE
    ----------------------------------------
    ANALYZE ANY
   
    1 row selected.
   
    SQL> select r.role, r.privilege
         from user_role_privs u,role_sys_privs r
         where u.granted_role=r.role
         and r.privilege='ANALYZE ANY'
         /
   
    no rows selected
   
    SQL> select privilege
         from user_sys_privs
         where privilege='ANALYZE ANY'
         /
   
    PRIVILEGE
    ----------------------------------------
    ANALYZE ANY
   
    1 row selected.

Cause

Several default roles where missing necessary privileges :

SQL> select * from USER_ROLE_PRIVS
     order by granted_role;
   
    USERNAME   GRANTED_ROLE   ADM   DEF   OS_
    SYS   OEM_ADVISOR   YES   YES   NO
    SYS   SCHEDULER_ADMIN   YES   YES   NO
   
    2 rows selected.
   
SQL> select * from ROLE_SYS_PRIVS
     order by role;
   
    ROLE              PRIVILEGE                  ADM
    ----------------  -------------------------  ---
    OEM_ADVISOR       ADMINISTER SQL TUNING SET  NO
    OEM_ADVISOR       ADVISOR                    NO
    OEM_ADVISOR       CREATE JOB                 NO
    SCHEDULER_ADMIN   CREATE ANY JOB             YES
    SCHEDULER_ADMIN   CREATE EXTERNAL JOB        YES
    SCHEDULER_ADMIN   CREATE JOB                 YES
    SCHEDULER_ADMIN   EXECUTE ANY CLASS          YES
    SCHEDULER_ADMIN   EXECUTE ANY PROGRAM        YES
    SCHEDULER_ADMIN   MANAGE SCHEDULER           YES
   
    9 rows selected.
   

Roles like DBA, EXP_FULL_DATABASE, IMP_FULL_DATABASE are not granted to SYS anymore or are lacking the necessary privileges.


Solution

In a clean created 10G database there should be are 297 privileges granted to the SYS-roles :

SQL> select role, count(*)
from ROLE_SYS_PRIVS
group by role
order by role;

ROLE                           COUNT(*)
------------------------------ ----------
AQ_ADMINISTRATOR_ROLE             6
CONNECT                           1
DBA                             160
EXP_FULL_DATABASE                 8
IMP_FULL_DATABASE                68
JAVADEBUGPRIV                     2
MGMT_USER                         2
OEM_ADVISOR                       3
OEM_MONITOR                       7
OLAP_DBA                         10
OLAP_USER                         5
RECOVERY_CATALOG_OWNER           11
RESOURCE                          8
SCHEDULER_ADMIN                   6

14 rows selected.



Regranting the SYS-privileges to the SYS-roles resolved the ORA-20000

回复 只看该作者 道具 举报

10#
发表于 2012-6-17 22:00:01
另一种可能性


SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

SQL> create user icd identified by icd;

User created.

SQL> grant dba to icd;

Grant succeeded.

SQL> conn icd/icd
Connected.
SQL> create table "tchat" (t1 int);

Table created.

SQL>
SQL> conn / as sysdba
Connected.
SQL> exec dbms_stats.gather_table_stats('ICD','TCHAT');
BEGIN dbms_stats.gather_table_stats('ICD','TCHAT'); END;

*
ERROR at line 1:
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT", insufficient privileges or
does not exist
ORA-06512: at "SYS.DBMS_STATS", line 15017
ORA-06512: at "SYS.DBMS_STATS", line 15049
ORA-06512: at line 1


SQL> exec dbms_stats.gather_table_stats('ICD','tchat');
BEGIN dbms_stats.gather_table_stats('ICD','tchat'); END;

*
ERROR at line 1:
ORA-20000: Unable to analyze TABLE "ICD"."TCHAT", insufficient privileges or
does not exist
ORA-06512: at "SYS.DBMS_STATS", line 15017
ORA-06512: at "SYS.DBMS_STATS", line 15049
ORA-06512: at line 1



以小写形式的 create的表名 因为 dbms_stats自动转换为大写形式  会导致 ORA-20000错误
可以通过  双引号 解决该问题


SQL>  exec dbms_stats.gather_table_stats('ICD','"tchat"');

PL/SQL procedure successfully completed.










尝试用 dbms_metadata.get_ddl 获取 TCHAT表 的实际DDL

回复 只看该作者 道具 举报

9#
发表于 2012-6-15 13:41:36
看了   只找到一个情况相符的bug Bug 6766012可惜是10g的版本不符合,帮看一下吧
原帖由 magic007 于 2012-6-15 11:31 发表 打开10046事件跟一下。

kfdb2_ora_13014.zip

38.83 KB, 下载次数: 1240

回复 只看该作者 道具 举报

8#
发表于 2012-6-15 11:31:24
打开10046事件跟一下。

回复 只看该作者 道具 举报

7#
发表于 2012-6-15 11:14:50

回复 6# 的帖子

错误提示 是可以自己定义的 ,你想要怎么样都可以的。  ORA-20000就是自定义的错误, 你只要找trigger 就是了

回复 只看该作者 道具 举报

6#
发表于 2012-6-15 10:53:40
谢谢大神 不过不是这个原因,错误提示都不一样

回复 只看该作者 道具 举报

5#
发表于 2012-6-14 23:29:07
[oracle@nas ~]$ oerr ora 20000
20000, 00000, "%s"
// *Cause:  The stored procedure 'raise_application_error'
//          was called which causes this error to be generated.
// *Action: Correct the problem as described in the error message or contact
//          the application administrator or DBA for more information.


ORA-19999开始 的20000是 自定义的 application error  一看到20000就知道是  trigger在搞鬼了

create or replace trigger ddl_deny
before analyze on database
declare
  l_errmsg varchar2(100):= 'insufficient privileges or does not exist';
begin
if ora_sysevent = 'ANALYZE' then
raise_application_error(-20000, 'Unable to analyze '||ora_dict_obj_owner || '.' || ora_dict_obj_name || ',' || l_errmsg);
end if;
exception
  when no_data_found then
    null;
end;
/



Trigger created.


SQL> analyze table tv compute statistics;
analyze table tv compute statistics
              *
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: Unable to analyze SYS.TV,insufficient privileges or does not exist
ORA-06512: at line 5

SQL> alter trigger ddl_deny disable;

Trigger altered.

SQL> analyze table tv compute statistics;

Table analyzed.

回复 只看该作者 道具 举报

4#
发表于 2012-6-14 14:39:18

回复 3# 的帖子

不行
另外补充一下 ,另一个节点执行也不行

回复 只看该作者 道具 举报

3#
发表于 2012-6-14 14:32:22
exec sys.dbms_stats.gather_table_stats ( ownname => 'ICD',tabname => 'TCHAT',cascade => false);

这个行吗?

回复 只看该作者 道具 举报

2#
发表于 2012-6-14 12:54:30
请把表的定义给贴出来。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-26 12:23 , Processed in 0.055403 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569