Skip to Main Content

Breadcrumb

Unified Audit Trail Management

Audit Trail Management - Unified Auditing

Was tun, wenn in einer 12.1 SE2 Datenbank Datenbank die Objekte im SYSAUX Schema zu groß wurden?

Unterschätzt man die Menge an Audit Records oder läuft das Audit Cleaning nicht, kann es passieren, dass die Audit Objekte sehr groß werden können.

Verwendet man eine Enterprise Edition oder bereits die Version 12.2 werden mit dem Purge des Audit-Trails auch die Segmente verkleinert. Oracle verwendet hier im Hintergrund Partitioning und löscht einfach die Partition.

In Version 12.1 verwendet die Standard Edition 2 leider kein Partitioning.

Selbst nach einem "vollständigen" Löschen des Audit-Trails mit

BEGIN
  DBMS_AUDIT_MGMT.clean_audit_trail(
  audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
  use_last_arch_timestamp => FALSE);
END;
/

wird der Platz nicht wieder frei gegeben.

Damit bleibt einem offiziell nur, die Datenbank zu exportieren, in eine neue Datenbank zu importieren und in Zukunft darauf zu achten, dass das Audit-Trail nicht wieder so groß wird.

Eine nur in den wenigsten Fällen praktikable Lösung.

Was kann man also statt dessen tun?

Als Erstes könnte einem da einfallen, die Tabelle einfach nach dem Löschen zu reorganisiern.

Zuerst sucht man sich also die Tabelle heraus:

SQL> select table_name from dba_tables where owner='AUDSYS';

TABLE_NAME
-----------------------
CLI_SWP$5b6fb1fa$1$1

SQL> desc audsys."CLI_SWP$5b6fb1fa$1$1"

Name          Null?    Type
------------- -------- ----------------------------
INST#                  NUMBER
BUCKET#                NUMBER
INST_LOB#              NUMBER
MAX_SEQ#               NUMBER
FLUSH_SCN              NUMBER
FLUSH_TIME             DATE
MIN_SCN                NUMBER
MAX_SCN                NUMBER
MIN_TIME               DATE
MAX_TIME               DATE
SID#                   NUMBER
SERIAL#                NUMBER
STATUS                 NUMBER
LOG_PIECE              BLOB

Das Unified Auditing Trail verwendet ein BLOB für die Spalte LOG_PIECE und das ist der Grund warum der Platz nach dem Purge nicht frei gegeben wird.

Versucht man nun die Tabelle, bzw. das LOB zu reorganisieren wird das folgendermaßen quittiert:

SQL> alter table "AUDSYS"."CLI_SWP$5b6fb1fa$1$1" move lob (log_piece) store as (tablespace sysaux);

alter table "AUDSYS"."CLI_SWP$5b6fb1fa$1$1" move lob (log_piece) store as (tablespace sysaux)
                    *
ERROR at line 1:
ORA-55941: DML and DDL operations are not allowed on table "AUDSYS"."CLI_SWP$5b6fb1fa$1$1"

Was passiert hier?

Um das Audit-Trail zu schützen, ist es nur mit dem Package DBMS_AUDIT_MGMT möglich es zu manipulieren. Dieses sorgt dafür, dass auch das Löschen des Audit-Trails protokolliert wird.

Den gleichen Fehler bekommt man, wenn man veruscht, Daten aus dieser Tabelle zu löschen oder zu ändern.

Allerdings gibt es eine Möglichkeit, diesen Sicherheitsmechansimus auszuhebeln.

Bei Upgrades wird ja das Data-Dictionary eben geändert. Dazu werden durch den Upgrade Modus einige Parameter dynamisch gesetzt, unabhängig davon was im Parameterfile steht. In unserem Fall ist der wichtige Parameter

ALTER SYSTEM SET _system_trig_enabled=FALSE SCOPE=MEMORY;

Also öffnen wir die Datenbank im Upgrade Modus:

SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    
    SQL> startup upgrade
    ORACLE instance started.
    ...
    Database mounted.
    Database opened.

Damit kann man das LOB reorganisieren:

SQL> alter table audsys."CLI_SWP$5b6fb1fa$1$1" move lob (log_piece) store as (tablespace sysaux);
    
    Table altered.
    

Noch die Indizes neu bauen (diese werden durch das Verschieben UNUSABLE):

SQL> ALTER INDEX "AUDSYS"."CLI_LOB$5b6fb1fa$1$1" rebuild;
    
    Index altered.
    
    SQL> ALTER INDEX "AUDSYS"."CLI_SCN$5b6fb1fa$1$1"  rebuild;
    
    Index altered.
    
    SQL> ALTER INDEX "AUDSYS"."CLI_TIME$5b6fb1fa$1$1"  rebuild;
    
    Index altered.

Danach die DB wieder normal starten:

SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    
    SQL> startup
    ORACLE instance started.
    ...
    Database mounted.
    Database opened.

Eine Anmerkung:

Theoretisch wäre es natürlich auch möglich auf diese Weise einfach das Audit-Trail mit einem TRUNCATE zu löschen. Aber es geht uns ja nicht darum, die Daten zu manipulieren, sondern den leeren Platz aus dem Audit-Trail wieder leer zu bekommen.