登录数据库时提示:
ERROR:
ORA-02002: error while writing to audit trail
ORA-00604: error occurred at recursive SQL level 1
ORA-01013: user requested cancel of current operation
理所应当就检查审计策略:
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /app/admin/oracledb/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string DB
SQL>
Oracle 11g 默认开启AUDIT功能,如SYSTEM表空间自增会不断增大空间使用,所以根据业务实际需求开启/关闭AUDIT功能,命令如下:
SQL>alter system set audit_trail=none scope=spfile;
直接使用spfile文件中的审计功能audit_trail为none,即关闭审计功能。需要重启数据库生效。
同时发现system表空间也满了:
TABLESPACE_NAME | SUM_SPACE(M) | SUM_BLOCKS | USED_SPACE(M) | USED_RATE(%) | FREE_SPACE(M) | |
---|---|---|---|---|---|---|
1 | SYSAUX | 580 | 74240 | 551.06 | 95.01% | 28.94 |
2 | SYSTEM | 750 | 96000 | 742.75 | 99.03% | 7.25 |
查看system表空间中占用空间大的对象:
SQL> select *
2 from (select SEGMENT_NAME, sum(bytes) / 1024 / 1024 syssize
3 from dba_segments
4 where tablespace_name = 'SYSTEM'
5 group by segment_name
6 order by syssize desc)
7 where rownum < 10;
SEGMENT_NAME SYSSIZE
-------------------------------------------------- ----------
IDL_UB1$ 272
SOURCE$ 72
IDL_UB2$ 31
C_TOID_VERSION# 24
I_SOURCE1 13
ARGUMENT$ 12
JAVA$MC$ 12
C_OBJ# 12
IDL_CHAR$ 11
9 rows selected
Executed in 0.28 seconds
结果发现占空间大的表并不是审计相关的表,而是一个IDL_UB1$表。750M的表空间,它占了三分之一。
从sql.bsq中我们可以找到这个表的创建语句:
create table idl_ub1$ /* idl table for ub1 pieces */
( obj# number not null, /* object number */
part number not null,
/* part: 0 = diana, 1 = portable pcode, 2 = machine-dependent pcode */
version number, /* version number */
piece# number not null, /* piece number */
length number not null, /* piece length */
piece long raw not null) /* ub1 piece */
storage (initial 10k next 100k maxextents unlimited pctincrease 0)
/
idl_ub1$表是用来存储PL/SQL的代码单元的,包括DIANA等,IDL在这里代表Interface Definition Language 。
在高级复制中会用到这个表,所以可能导致这个表快速增长。
的确如此,数据库正在做大数据的物化视图刷新。
因此问题明确了,由于物化视图刷新造成idl_ub1$表快速增加,导致了system表空间满,但是表象是登录是审计报错,原因是system表空间满了。扩充system表空间解决问题。