Unified Audit 12.2 vs 12.1

Cet article fait suite à 12c : (Pure) Unified Auditing qui avait été écrit pour la 12.1, la 12.2 n’étant alors pas encore sortie. L’audit unifié était une nouveauté de cette release. Mais avec la version 12.2, Oracle a changé l’architecture de l’audit unifié. Sur le principe il reste unifié, c’est-à-dire qu’il regroupe tous les audits en une seule table comme écrit dans le précédent article; ce qui change c’est l’architecture de cette table et aussi son mode de collecte.

En 12.1 la table de l’audit trail se nomme AUDSYS.CLI_* (nom dépendent de la base), en 12.2 elle se nomme AUDSYS.AUD$UNIFIED. Mais la véritable différence est qu’en 12.1 les données de l’audit se trouvent dans un champs de type blob (colonne LOG_PIECE) alors que sur la 12.2 les données de d’audit se trouvent éclatées au niveau des colonnes de façon classique comme pour l’audit standard dans la table SYS.AUD$ en 11g et avant.

En 12.1, dans la table AUDSYS.CLI_*, une ligne semble correspondre aux audit trails pour une session (SID#,SERAIL#) entre 2 flush d’audit (FLUSH_SCN, MAX_SCN, MIN_SCN), voir extract ci-dessous. En effet, une nouveauté en 12.1, qui sur le papier semble une très bonne idée, et qu’il est possible de ne pas écrire en direct dans la table d’audit mais dans un buffer queue (paramètre d’init : unified_audit_sga_queue_size et activation/désactivation avec la procédure DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY). D’où on peut en déduire que chaque fois que le cache de l’audit unifié est plein, il descend alors à ce moment-là en base et qu’il est mis dans le champs de type blob : LOG_PIECE.

Si on édite le blob, l’on peut voir/distinguer ce qui ressemble à des données d’audit :

Et l’on peut retrouver cet audit trail dans la vue prévue à cette effet : UNIFIED_AUDIT_TRAIL, qui existe et à la même structure en 12.1 et en 12.2:

SQL>  select os_username,userhost,terminal,client_program_name,object_name,sql_text from UNIFIED_AUDIT_TRAIL where sql_text like '%set_last_archive_timestamp%4%10-MAY-18%';

OS_USERNAME          USERHOST             TERMINAL             CLIENT_PROGRAM_NAME            OBJECT_NAME          SQL_TEXT
-------------------- -------------------- -------------------- ------------------------------ -------------------- --------------------------------------------------------------------------------
grid                 mbackup-srv          UNKNOWN              oracle@mbackup-srv (J001)      DBMS_AUDIT_MGMT      begin sys.dbms_audit_mgmt.set_last_archive_timestamp(4, '10-MAY-18 12.00.00.0000

 

Cela signifie qu'en 12.1, la vue UNIFIED_AUDIT_TRAIL doit faire une transformation/conversion à chaque interrogation sur la table AUDSYS.CLI*. Est-ce cela la cause des bug 21119008 (poor query performance on unified_audit_trail) et 22782757 ? … il y a de forte chance car le patch correctif 22782757 consiste à créer la table AUDSYS.AUD$UNIFIED exactement comme celle de la 12.2. Une procédure de migration est fournie par ce patch pour déplacer les données alors de AUDSYS.CLI* vers AUDSYS.AUD$UNIFIED.

Cette nouvelle table (AUDSYS.AUD$UNIFIED) n’utilise plus la nouvelle feature d’écriture en différée qui passait par le buffer queue unified_audit_sga_queue. C’est un peu comme si Oracle revenait en arrière sur sa nouveauté. D’ailleurs le paramètre unified_audit_sga_queue_size est deprecated en 12.2, il est laissé pour la retro compatibilité. Il n'aura duré que le temps d'une release.

Il est intéressant de remarquer que la nouvelle table en AUDSYS.AUD$UNIFIED, est partitionnés par mois sur EVENT_TIMESTAMP ce qui peut être plus performant pour les recherches par date mais aussi pour la purge : delete des vieux audit puis quand la partition est vide drop ou truncate de celle-ci pour une récupération des blocs libres dans le tablespace. C'est ce qui manquait à l'ancienne table SYS.AUD$ des versions antérieures à la 12c.