Introduction
La version 11g introduit une nouvelle infrastructure pour le diagnostic des problèmes, Automatic Diagnostic Repository.
ADR se présente sous la forme d'une arborescence de répertoires qui stocke de manière centralisée les données de diagnostic.
Il existe 2 concepts :
- Les problèmes : Erreur Internes ORA-00600, OS ORA-07445...Chaque problème inclut un code ORA...et éventuellement des paramètres supplémentaires.
- Les incidents : Il s'agit d'une occurrence d'un problème, chaque incident porte un numéro
Le référentiel ADR
Stocke tous les fichiers de traces et journaux pour l'ensemble des produits s'exécutant sur le serveur.
- BD,
- listener...
Défini par le paramètre DIAGNOSTIC_DEST, sa valeur par défaut est $ORACLE_BASE si cette variable est définie, sinon $ORACLE_HOME/log
La racine de ce répertoire se nomme diag et contient un sous répertoire par produit Oracle
- rdbms → BD, ce répertoire contient un sous répertoire par instance de base de données.
- tnslsnr→ listener...
Les principaux répertoires sont :
- Alert : Fichier d'alerte format XML
- Incident : Fichiers relatifs aux incidents
- Trace : Fichier de trace des processus et format texte du fichier d'alerte bien connu ( alert.log )
Les anciens paramètres BACKGROUND_DUMP_DEST et USER_DUMP_DEST sont dépréciés.
Fichiers d'alertes et de traces
Oracle maintient un fichier d’alerte dans lequel il écrit des messages d’information ou d’erreurs sur la vie de la base de données :
- Création de la base de données,
- Démarrages et arrêts,
- Modifications de la structure (tablespaces, fichiers de données),
- Erreurs internes (ORA-00600, ORA-07445),
- Erreurs de bloc corrompu (ORA-01578),
- Problèmes relatifs à l’écriture ou à l’archivage des fichiers de journalisation.
En complément, lorsqu’un processus rencontre un problème, il écrit des informations dans un fichier de trace.
Le fichier d'alerte est disponible sous deux formats : texte et XML.
- Le nom du fichier d’alerte xml est de la forme : log.xml ( sous répertoire alert )
- Le nom du fichier d’alerte texte est de la forme : alert_<SID>.log ( sous répertoire trace )
Processus d'arrière plan ( sous répertoire trace )
- Le nom des fichiers de trace des processus d’arrière-plan est de la forme : <sid>_<nom_processus>_<id_processus>.trc.
- Le nom des fichiers de trace des processus serveur est de la forme : <sid>_ora_<id_processus>.trc.
ADRCI
Automatic Diagnostic Repository Command Interpreter. Outil ligne de commande et interactif pour gérer les erreurs Oracle. Dans ce billet nous allons voir les fonctionnalités suivantes :
- Visualiser le fichier alert.log
- Gestion des problèmes et des incidents
- Création de packages zippés pour envoi au support Oracle.
- Purge des fichiers de traces.
Pour la rédaction de cet exemple, je me suis inspiré de l'article anglais suivant
Un exemple de dysfonctionnement
Se connecter en sys
sqlplus sys/manager11@red as sysdba SQL> create user alice identified by ecila; SQL> grant connect,resource to alice; SQL> connect alice/ecila@red SQL> create table t ( n number ); SQL> select object_id from user_objects;
Noter le numéro retourné par la requête ( exemple 17322 ) et se reconnecter sys
SQL>connect sys/manager11@red as sysdba SQL>update tab$ set cols=2 where obj#=17322; SQL>commit;
Cet update fausse le dictionnaire des données, à ne pas faire en production !
Tester le dysfonctionnement
Dans un premier temps purger la shared_pool afin de vider le dictionnary cache
SQL> alter system flush shared_pool;
Se reconnecter alice
SQL> connect alice/eciala@red SQL> select * from t; ERROR at line 1: ORA-03113: end-of-file on communication channel Process ID: 2236 Session ID: 29 Serial number: 9
Sortir du SQL par exit
Utilisation de adrci
Au niveau du shell, lancer adrci, puis la commande show home
adrci>show home ADR Homes: diag/tnslsnr/SILVERLAKE/listener diag/rdbms/red/RED
Il existe plusieurs ADR directory, relatives ici au listener ( diag/tnslsnr ) et au moteur de Oracle ( diag/rdbms ). L'erreur s'est produite au niveau du moteur Oracle donc rdbms. Toujours sous adrci, se positionner dans la bonne arborescence.
adrci> set home diag/rdbms/red/RED
Visualiser la fin du fichier alert.log
adrci>show alert -tail
Identifier le problème
ADR défini les concepts de problème et d'incident.
Un incident est une occurrence d'un problème, ainsi si la même erreur se reproduit une seconde fois il n'y aura qu'un problème mais 2 incidents.
Ouvrir une seconde session et sous sqlplus en connexion alice et relancer la commande select * from t;
A nouveau sous adrci taper la commande show problem.
adrci>show problem
Relever le numero du problème ( problem_id ) exemple ici : 1
Identifier les incidents
adrci> show incident
Relever le numéro de l'incident, par exemple 12971.
Demander l'affichage de l'incident
adrci> show incident -mode detail -p "incident_id=12971"
Repérer le numéro du PROBLEM_ID et demander l'édition de la trace, il s'agit du nom de fichier de la dernière ligne.
adrci>show trace /u01/app/oracle/diag/rdbms/yoda/YODA/incident/incdir_12971/YODA_ora_2944_i12971.trc
Ceci lance dans vi le fichier trace, il est possible de retrouver la requête SQL en recherchant le mot "current_sql"
***** Current SQL Statement for this session (sql_id=89km4qj1thh13) ***** select * from t ***** current_sql_statement *****
Envoyer les traces au support Oracle
Le problème généré dans cet exemple ne peut pas être facilement diagnostiqué, aussi il faut envoyer les traces au support oracle, pour cela créer un package zippé.
adrci>ips create package problem 1 correlate all Created package 2 based on problem id 1, correlation level all
Selon le cas, le chiffre peut être différent de "1"
adrci>ips generate package 2 in "/home/oracle" Generated package 2 in file /home/oracle/ORA7445qc_20120606132038_COM_1.zip, mode complete
Ici aussi, selon le cas le chiffre peut être différent de "2"
Envoyer le fichier zip à Oracle.
Il existe sous My Oracle Support une page spéciale pour ce type d'erruer ( ORA-00600 et ORA-07445 )
Purge des traces
Avec le temps il est nécessaire de purger les traces. La commande suivante liste l'ensemble des traces par ordre chronologique
adrci> show tracefile -rt
La durée de retention par défaut des traces ordinaires( switch redo log par exemple ) est de 720 heures, soit 30 jours. Pour les incidents 8760 heures soit un an
adrci>show control SHORTP_POLICY : Traces ordinaires → 720 LONGP_POLICY : Incidents → 8760
Ceci se paramètre par les commandes suivantes :
adrci> set control (SHORTP_POLICY = 360) → 15 jours adrci> set control (LONGP_POLICY = 2190) → 3 mois.
Pour purger les traces on indique le nombre de minutes, par exemple purger les traces de plus de 2 jours ( 2880 minutes )
adrci> purge -age 2880 -type trace