Quelques informations utiles sur les events Oracle

L’objectif ici est de répertorier dans un seul article toutes les commandes d’activation, de désactivation et de supervision des events sur une instance Oracle. Je n’aborderai par contre pas l’utilisation des events au niveau session.

Nous avons à notre disposition 4 catégories d’events.
Dans la suite de cet article, je n’évoquerai que les 2 premières catégories de la liste suivante :
 

  • Erreur Oracle : ORA-01652 (remplissage du tablespace temporaire)
  • Traces de processus : 10046 (processus serveur Oracle)
  • Changement du comportement du moteur : 10949 (désactive les direct path reads en 11g dans certains cas)
  • Dump d’un fichier ou d’une zone mémoire : SYSTEMSTATE

Activation d’un event pour tracer un code erreur Oracle :

ALTER SYSTEM SET EVENTS '1652 trace name errorstack';

L’event sera actif pour toutes les sessions (nouvelles et existantes).
En cas de saturation du tablespace temporaire de la base, l’event tracera l’erreur dans le fichier alert.log et en créant un fichier sous bdump :
Activation d’un event pour tracer des sessions Oracle :

ALTER SYSTEM SET EVENTS '10046 trace name context forever, level 1';

L’event indiquera chaque ordre SQL exécuté sur l’instance Oracle dans un fichier trace sous udump.
Lors de l’activation de ce type d’event, vous pouvez jouer sur l’exécution de l’event en remplaçant l’option FOREVER :

    • Nombre d’exécutions de l’event
ALTER SYSTEM SET EVENTS '10046 trace name context lifetime 1000, level 1';
    • Ignorer les premières occurences
ALTER SYSTEM SET EVENTS '10046 trace name context after 500 occurences, level 1';

Bien entendu, vous pouvez cumuler ces différentes options.
Tous les events activés jusqu’à maintenant ont une durée de vie limitée, celle de l’instance Oracle.
Activation d’un event restant actif après un redémarrage de l’instance Oracle :

ALTER SYSTEM SET EVENT='1652 trace name errorstack' SCOPE=SPFILE;

L’activation d’un event persistant nécessite donc un redémarrage de l’instance Oracle pour sa prise en compte.
Pour simuler un SCOPE=BOTH, vous devez effectuer les 2 ordres SQL :

ALTER SYSTEM SET EVENTS '1652 trace name errorstack';
ALTER SYSTEM SET EVENT='1652 trace name errorstack' SCOPE=SPFILE;

Pour activer plusieurs events sur une instance Oracle :

ALTER SYSTEM SET EVENT='10046 trace name context forever, level 1','1652 trace name errorstack' SCOPE=SPFILE;

Identification des events actifs sur une instance Oracle

SELECT SID, NAME, VALUE FROM V$SPPARAMETER WHERE NAME='event';

Cette commande ne vous retourne que les events renseignés dans le spfile donc persistants.
Si vous souhaitez relever tous les events non persistants d’une instance, vous devez utiliser le package DBMS_SYSTEM

set serveroutput on
declare
  output binary_integer;
begin
  for i in 1..99999
  loop
    dbms_system.read_ev(i,output);
    dbms_output.enable(1000);
    if output <> 0 then
       dbms_output.put_line('Event '||i||' : Actif');
    end if;
  end loop;
end;
/

Autre remarque à propos des bases en RAC, n’oubliez pas de répéter l’ALTER SYSTEM sur toutes les instances d’une base en RAC si vous n’utilisez pas le spfile.
Désactivation des events :

ALTER SYSTEM SET EVENTS '1652 trace name context off';

Si vous souhaitez que la désactivation soit persistante au redémarrage de l’instance Oracle, vous devez effectuer la commande suivante :

ALTER SYSTEM RESET EVENT SCOPE=SPFILE;

Comme pour l’activation, l’option SCOPE=BOTH|MEMORY n’est pas acceptée par Oracle.
Pour désactiver totalement un event, vous devez saisir les 2 ALTER SYSTEM.
Pour un event spécifique, vous devez modifier le paramètre event du spfile en ne gardant que les events souhaités.