Moving AUD$ table to another tablespace in 11gR2

From 11gR2 moving the AUD$ table to another tablespace using dbms_audit_mgmt, has been officially introduced/supported. DBMS_AUDIT_MGMT enables audit administrators to manage the various audit trail types like database audit trails, operating system (OS) audit trails, and XML audit trails. It is installed by default in Oracle 11.2 and makes thing easier.

SQL> SELECT table_name, tablespace_name FROM dba_tables WHERE table_name IN ('AUD$', 'FGA_LOG$') ORDER BY table_name;

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
AUD$                           SYSTEM
FGA_LOG$                       SYSTEM

SQL> select segment_name,bytes/1024/1024 size_in_megabytes from dba_segments where segment_name in ('AUD$','FGA_LOG$');

SEGMENT_NAME                                                                      SIZE_IN_MEGABYTES
--------------------------------------------------------------------------------- -----------------
AUD$                                                                                          .5625
FGA_LOG$                                                                                      .0625

Now, suppose we deleted rows from aud$ and now want to shrink the table. It couldn’t be done as AUD$ is in SYSTEM tablespace whose segment space management is MANUAL.

SQL> alter table sys.aud$ enable row movement;

Table altered.

SQL> alter table sys.aud$ shrink space cascade;
alter table sys.aud$ shrink space cascade
*
ERROR at line 1:
ORA-10635: Invalid segment or tablespace type

In such cases, you can now move the AUD$ table to the tablespace with AUTO segment space management and shrink it.To do so –

SQL> BEGIN
  2  DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  3  audit_trail_location_value => 'USERS');
  4  END;
  5  /

PL/SQL procedure successfully completed.

SQL> SELECT table_name, tablespace_name FROM dba_tables WHERE table_name IN ('AUD$', 'FGA_LOG$') ORDER BY table_name;

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
AUD$                           USERS
FGA_LOG$                       SYSTEM

SQL> select segment_name,bytes/1024/1024 size_in_megabytes from dba_segments where segment_name in ('AUD$','FGA_LOG$');

SEGMENT_NAME                                                                      SIZE_IN_MEGABYTES
--------------------------------------------------------------------------------- -----------------
AUD$                                                                                           .625
FGA_LOG$                                                                                      .0625

SQL> @table_info
Enter value for table_name: aud$
old   9: WHERE  table_name  like UPPER('%&table_name%')
new   9: WHERE  table_name  like UPPER('%aud$%')

TABLE_NAME                     OWNER                          TABLESPACE_NAME                  NUM_ROWS LAST_ANALYZED     AVG_ROW_LEN     BLOCKS EMPTY_BLOCKS
------------------------------ ------------------------------ ------------------------------ ---------- ----------------- ----------- ---------- ------------
AUD$                           SYS                            USERS                                2331 19-01-12 14:06:33         186         68            0

The last_analyed date got changed too, so seems like oracle internally analyzes it. Internally oracle does

PARSING IN CURSOR #880020292 len=94 dep=1 uid=0 oct=1 lid=0 tim=14104773154 hv=269341700 ad='287d2a1c' sqlid='99yczn480vp04'
ALTER TABLE "SYS".AUD$ MOVE TABLESPACE USERS LOB(SQLBIND, SQLTEXT) STORE AS (TABLESPACE USERS)
END OF STMT
SQL> select owner,table_name,column_name,segment_name,tablespace_name,index_name from dba_lobs where owner='SYS' and table_name='AUD$';

OWNER                          TABLE_NAME                     COLUMN_NAM SEGMENT_NAME                TABLESPACE_NAME           INDEX_NAME
------------------------------ ------------------------------ ---------- ------------------------------ ------------------------------ ------------------------------
SYS                            AUD$                           SQLBIND    SYS_LOB0000000384C00040$$   USERS                             SYS_IL0000000384C00040$$
SYS                            AUD$                           SQLTEXT    SYS_LOB0000000384C00041$$   USERS                             SYS_IL0000000384C00041$$

Leave a comment