暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

设置AUTOTRACE出现ORA-3212错误

老杨 2019-04-18
644

问题描述

客户环境下设置了AUTOTRACE,结果碰到了ORA-3212错误。
详细错误如下:

SQL> conn / AS sysdba
SQL> GRANT SELECT ON v_$session TO posmrk;
GRANT succeeded.
SQL> GRANT SELECT ON v_$mystat TO posmrk;
GRANT succeeded.
SQL> GRANT SELECT ON v_$statname TO posmrk;
GRANT succeeded.
SQL> CONN POSMRK 
Enter password: 
Connected.
SQL> @?/rdbms/admin/utlxplan
TABLE created.
SQL> conn posmrk@219.143.210.210:1621/pcmrk
已连接。
SQL> SET autot trace
SQL> SELECT * FROM dual;
Error ORA-942 while gathering statistics
SP2-0612: Error generating AUTOTRACE report
SP2-0612: Error generating AUTOTRACE report
Execution Plan
----------------------------------------------------------
An uncaught error happened IN fetching the records : ORA-03212: TEMPORARY Segment cannot be created IN locally-managed tablespace
ORA-03212: TEMPORARY Segment cannot be created IN locally-managed tablespace
SP2-0612: Error generating AUTOTRACE STATISTICS report


专家解答

由于当时没有网络和文档,只能根据错误描述来分析问题。这个错误似乎和表空间以及临时段有关,那么问题牵扯的层面并不太多。
检查了一下数据库的临时表空间设置,并未发现问题,检查了一下用户的表空间以及UNLIMITED TABLESPACE权限,也未发现异常。

SQL> conn system
Connected.
SQL> SET autot trace     
SQL> SELECT * FROM dual;
Execution Plan
----------------------------------------------------------
Plan hash VALUE: 272002086
--------------------------------------------------------------------------
| Id  | Operation         | Name | ROWS  | Bytes | Cost (%CPU)| TIME     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo SIZE
        407  bytes sent via SQL*Net TO client
        400  bytes received via SQL*Net FROM client
          2  SQL*Net roundtrips TO/FROM client
          0  sorts (memory)
          0  sorts (disk)
          1  ROWS processed
SQL> SET autot off

切换为其他用户,没有发现异常,说明应该是错误用户本身的设置所致。

SQL> SELECT username, temporary_tablespace 
  2  FROM dba_users
  3  WHERE username = 'POSMRK';
USERNAME                 TEMPORARY_TABLESPACE
------------------------ -----------------------------
POSMRK                   SYSTEM
SQL> ALTER USER posmrk TEMPORARY tablespace temp;
USER altered.
SQL> conn posmrk 
Connected.
SQL> SET autot trace
SQL> SELECT * FROM dual;
Error ORA-942 while gathering statistics
SP2-0612: Error generating AUTOTRACE report
SP2-0612: Error generating AUTOTRACE report
Execution Plan
----------------------------------------------------------
Plan hash VALUE: 272002086
--------------------------------------------------------------------------
| Id  | Operation         | Name | ROWS  | Bytes | Cost (%CPU)| TIME     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
SP2-0612: Error generating AUTOTRACE STATISTICS report

检查用户的临时表空间设置,发现错误的设置为SYSTEM,显然这时导致问题的原因,从SYSTEM表空间转变为LOCAL管理方式以后,就不应该设置SYSTEM作为临时表空间了,而应该使用专门的TEMPORARY表空间。
对这个设置进行修改后,ORA-3212错误已经小时,还存在一个ORA-942错误,这个错误以前碰到过,应该是缺少动态视图的权限所致:

SQL> SET autot off
SQL> SELECT TABLE_NAME, privilege FROM user_tab_privs WHERE TABLE_NAME LIKE 'V_$%';
TABLE_NAME                     PRIVILEGE
------------------------------ -----------------------------------------------
V_$SESSION                     SELECT
V_$MYSTAT                      SELECT
V_$STATNAME                    SELECT
SQL> conn / AS sysdba
Connected.
SQL> GRANT SELECT ON v_$sesstat TO posmrk;
GRANT succeeded.
SQL> conn posmrk
Connected.
SQL> SET autot trace
SQL> SELECT * FROM dual;
Execution Plan
----------------------------------------------------------
Plan hash VALUE: 272002086
--------------------------------------------------------------------------
| Id  | Operation         | Name | ROWS  | Bytes | Cost (%CPU)| TIME     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo SIZE
        407  bytes sent via SQL*Net TO client
        400  bytes received via SQL*Net FROM client
          2  SQL*Net roundtrips TO/FROM client
          0  sorts (memory)
          0  sorts (disk)
          1  ROWS processed
SQL> SET autot off

刚开始授权的时候,授权了V_$SESSION权限而缺少了V_$SESSTAT视图的权限,导致这个问题产生,对视图授权后,问题解决。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论