Le traçage est une partie importante du réglage de la base de données Oracle. Cela aidera à capturer toutes les déclarations de problème, les événements d'attente qui sont responsables du fonctionnement lent de la session.
La base de données Oracle a fourni de nombreux moyens les plus rapides pour tracer la session locale, une autre session utilisateur et formater la trace pour la rendre lisible
Voyons comment activer la trace SQL, événement 10046 dans la base de données Oracle et trcsess, utilitaire tkprof
Table des matières
- Événement SQL Trace ,100046
- Comment identifier les fichiers Trace
- comment vérifier si la trace est activée dans oracle
- Utilitaire Oracle tkprof
- Utilitaire Oracle trcsess
Trace SQL, événement 100046
Si vous souhaitez tracer en session locale, voici les étapes pour activer la trace SQL
Tracé normal modifier la session définie sql_trace =true ; -- Pour placer la trace sur une autre session, définissez sql_trace =false ; -- Pour désactiver la traceNiveau complet avec événement d'attente et liaison de trace alter session set events ='10046 trace name context forever, level 12';Pour désactiver le traçage, session set events ='10046 trace name context off';Identique à la trace normale exec DBMS_SESSION.set_sql_trace(sql_trace => TRUE);exec DBMS_SESSION.set_sql_trace(sql_trace => FALSE);
Si vous souhaitez tracer dans une autre session en cours d'exécution, voici les étapes
Tracé normal exécutez dbms_system.set_sql_trace_in_session ('sid','serial',true); -- Pour mettre le traçage onexecute dbms_system.set_sql_trace_in_session ('sid','serial',true); -- Pour désactiver le traçageNiveau complet avec événement d'attente et trace de liaison exécutez dbms_system.set_ev(‘sid’,’serial’,10046,12,’’);Pour désactiver la trace exécutez dbms_system.set_ev(‘sid’,’serial’,10046,0,’’);
Vous devez avoir vu l'utilisation de 12,0 dans diverses instructions ci-dessus. Ce sont des niveaux de traçage. Oracle Tracing a des niveaux de traçage. Voici les valeurs valides
0 | Aucune trace. Comme désactiver sql_trace. |
2 | L'équivalent de sql_trace standard Il fournit le chemin d'exécution, le nombre de lignes, le plus petit fichier plat Avantages Fournit le chemin d'exécution Fournit le nombre de lignes Produit le plus petit fichier plat Inconvénients Impossible de dire quelles valeurs ont été fournies au moment de l'exécution à SQL Si les statistiques de la requête sont faibles mais que le temps d'exécution est long, impossible de dire quels événements ont causé la longue attente |
4 | Identique à 2, mais avec l'ajout de valeurs de variables liées Avantages Fournit le chemin d'exécution Fournit le nombre de lignes Peut dire pour quelles valeurs l'instruction a été exécutée Inconvénients Encore une fois, si le temps d'exécution est long et les statistiques faibles, il sera difficile de dire pourquoi dans ce type de trace. Produit un fichier plat plus volumineux que la trace normale car les informations de variable de liaison doivent être stockées. |
8 | Identique à 2, mais avec l'ajout d'événements d'attente Regular Trace plus les délais d'opération de base de données que le SQL a attendu d'avoir effectués pour se terminer. Par exemple :les horaires d'accès au disque. Avantages Fournit le chemin d'exécution Fournit le nombre de lignes Peut indiquer les horaires de tous les événements associés à SQL. Inconvénients Le fichier de trace peut facilement atteindre son maximum en raison de toutes les informations qu'Oracle doit écrire dans le fichier de trace et seules des informations partielles sont disponibles dans le fichier de trace. Les informations de variable de liaison ne sont pas disponibles |
12 | Identique à 2, mais avec à la fois des valeurs de variable de liaison et des événements d'attente Traçage régulier avec les informations d'attente et de liaison. Contient les informations les plus complètes et produira le fichier de trace le plus volumineux. Fournit le chemin d'exécution Fournit le nombre de lignes Peut indiquer la durée de tous les événements associés à SQL. Peut indiquer les valeurs du SQL a été exécuté avec Avantages Fournit le chemin d'exécution Fournit le nombre de lignes Peut indiquer les horaires de tous les événements associés à SQL. Peut indiquer avec quelles valeurs le SQL a été exécuté Inconvénients Le fichier de trace peut facilement atteindre son maximum en raison de toutes les informations qu'Oracle doit écrire dans le fichier de trace et seules des informations partielles sont disponibles dans le fichier de trace. |
Il existe également d'autres façons de faire le traçage. En voici quelques-uns
(1) ORADEBUG
Cela nécessite une connexion en tant que sysdba
oradebug setospid 1111 -- Session de débogage avec le processus Oracle spécifié idoradebug setorapid 1111 --- Session de débogage avec le contexte de nom de trace de l'événement processoradebug du système d'exploitation spécifié pour toujours, niveau 4 ; événement oradebug 10046 contexte de nom de trace désactivé ; --- Cela désactive le traceoradebug close_trace --- Cela ferme le fichier de traceOradebug TRACEFILE_NAME ;
(2) Avec Oracle 10g, les options de traçage SQL ont été étendues à l'aide du package DBMS_MONITOR
EXECUTE dbms_monitor.session_trace_enableQui est similaireALTER SESSION SET EVENTS '10046 contexte de nom de trace pour toujours, niveau 2';EXECUTE dbms_monitor.session_trace_enable (binds=>true);Qui est similaireALTER SESSION SET EVENTS '10046 contexte de nom de trace pour toujours, niveau 4';EXECUTE dbms_monitor.session_trace_enable (waits=>true);Qui est similaireALTER SESSION SET EVENTS '10046 trace name context forever, level 8';EXECUTE dbms_monitor.session_trace_enable('sid','serial#')Qui est similaireexecute dbms_system.set_ev( 'sid','serial',10046,2,'');EXECUTE dbms_monitor.session_trace_enable ('sid','serial#',binds=>true);Qui est similaireexecute dbms_system.set_ev('sid','serial' ,10046,4,'');EXECUTE dbms_monitor.session_trace_enable ('sid','serial#',waits=>true);Qui est similaireexecute dbms_system.set_ev('sid','serial',10046,8,'' );
Il existe de nombreuses autres fonctionnalités disponibles dans dbms_monitor. Nous pouvons activer la trace en fonction de l'identifiant du client et de plusieurs façons
Comment identifier les fichiers Trace
Nous pouvons identifier les fichiers de trace en utilisant le spid de la session. De plus, le fichier de trace contiendra la paire sid,serial# au début du fichier de trace.
La requête ci-dessous peut être utilisée pour trouver le fichier de trace de la session locale
select c.value || '/' || d.nom_instance ||'_ora_' || a.spid || '.trc' tracefrom v$process a, v$session b, v$parameter c, v$instance dwhere a.addr =b.paddrand b.audsid =userenv('sessionid')and c.name ='user_dump_dest'/
Il existe un autre moyen simple d'identifier le fichier de suivi, appelé identifiant de suivi.
alter session set tracefile_identifer=’ORAC’ ; Ceci est l'identifiant
Exemple de fichier de suivi
Fichier de trace /app/oracle/TEST/diag/rdbms/test/TEST/trace/TEST_ora_13025_IDEN.trcOracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, Real Application Clusters, OLAP, Data Mining and Options de test d'application réelleORACLE_HOME =/app/oracle/TEST/11.2.0/dbSystem name : SunOS12Node name :sun12Release : 5.10Version : Generic_144488-11Machine : sun4uInstance name :TESTRedo thread monté par cette instance :1Oracle process number :202Unix process pid :13025 , image :[email protected] SunOS12*** 2013-10-21 12:28:56.461*** ID DE SESSION :(3875.17341) 2013-10-21 12:28:56.461*** ID CLIENT :() 2013 -10-21 12:28:56.461*** NOM DU SERVICE :(TEST) 2013-10-21 12:28:56.461*** NOM DU MODULE :([email protected](TNS V1-V3)) 2013-10 -21 12:28:56.461*** NOM DE L'ACTION :() 2013-10-21 12:28:56.461CLOSE #4:c=0,e=11,dep=1,type=1,tim=8866891135825=====================ANALYSE DANS LE CURSEUR #5 len=356 dep=1 uid=173 oct=3 lid=173 tim=8866891136821 hv=2468783182 ad='4c70e4398' sqlid='0wmwsjy9kd92f'SELECT PROFILE_OPTION_ID, APPLICATION_ID, SITE_ENABLED_FLAG , APP_ENABLED_FLAG , RESP_ENABLED_FLAG , USER_ENABLED_FLAG, ORG_ENABLED_FLAG , SERVER_ENABLED_FLAG, SERVERRESP_ENABLED_FLAG, HIERARCHY_TYPE, USER_CHANGEABLE_FLAG FROM FND_PROFILE_OPTIONS WHERE PROFILE_OPTION_NAME =:B1 AND START_DATE_ACTIVE <=SYSDATE AND NVL(END_DATE_ACTIVE, SYSDATE)>=SYSDATEEND OF STMTBINDS # 5 :Bind#0oacdty=01 mxl=128(80) mxlc=00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=01 csi=871 siz=128 off=0kxsbbbfp=ffffffff7d677b48 bln=128 avl=21 flg=0value="PER_BUSINESS_GROUP_ID"EXEC #5:c=0,e=1474,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,plh=1374985481 ,tim=8866891138224FETCH #5:c=0,e=61,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=1,plh=1374985481,tim=8866891138429CLOSE #5:c=0,e=5,dep=1,type=3,tim=8866891138503=====================ANALYSE DANS LE CURSEUR #4 len=230 dep=1 uid=173 oct=3 lid=173 tim=8866891138634 hv=3575592451 ad='3aeea3da0' sqlid='55dc767ajydh3'SELECT PROFILE_OPTION_VALUE FROM FND_PROFILE_OPTION_VALUES WH ERE PROFILE_OPTION_ID =:B4 AND APPLICATION_ID =:B3 AND LEVEL_ID =10003 AND LEVEL_VALUE =:B2 AND LEVEL_VALUE_APPLICATION_ID =:B1 AND PROFILE_OPTION_VALUE N'EST PAS NULLEND OF STMTBINDS #4:Bind#0oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=00 csi=00 siz=96 off=0kxsbbbfp=ffffffff7d677b68 bln=22 avl=03 flg=05value=1204Bind#1oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=00 csi=00 siz=0 off=24kxsbbbfp=ffffffff7d677b80 bln=22 avl=02 flg=01value=800Bind#2oacdty=02 mxl=22(21) mxlc =00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=00 csi=00 siz=0 off=48kxsbbbfp=ffffffff7d677b98 bln=22 avl=04 flg=01value=50334Bind#3oacdty=02 mxl=22(21 ) mxlc=00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=00 csi=00 siz=0 off=72kxsbbbfp=ffffffff7d677bb0 bln=22 avl=01 flg=01value=0EXEC #4:c=0, e=377,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,plh=2802907561,tim=8866891138978FETCH #4:c=0,e=26, p=0,cr=3,cu=0,mis=0,r=0,dep=1,og=1,plh=2802907561,tim=886689113 9050CLOSE #4:c=0,e=2,dep=1,type=3,tim=8866891139116=====================ANALYSE DANS LE CURSEUR #5 len =191 dep=1 uid=173 oct=3 lid=173 tim=8866891139308 hv=303338305 ad='3bedf0e48' sqlid='7qs7fx89194u1'SELECT PROFILE_OPTION_VALUE FROM FND_PROFILE_OPTION_VALUES WHERE PROFILE_OPTION_ID =:B4 AND APPLICATION_ID =:B2 AND LEVEL_ID =:B3 :AND LEVEL_ID =LEVEL_VALUE = :B1 ET PROFILE_OPTION_VALUE N'EST PAS NULLEND OF STMTBINDS #5 :Bind#0oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=00 csi=00 siz=96 off=0kxsbbbfp=ffffffff7d673b78 bln=22 avl=03 flg=05value=1204Bind#1oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=00 csi=00 siz=0 off=24kxsbbbfp=ffffffff7d673b90 bln=22 avl=02 flg=01value=800Bind#2oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00oacflg=03 fl2=1206001 frm=00 csi =00 siz=0 off=48kxsbbbfp=ffffffff7d673ba8 bln=22 avl=04 flg=01value=10001
comment vérifier si la trace est activée dans oracle
Si vous avez activé le traçage à l'aide du package DBMS_MONITOR, nous pouvons vérifier si le traçage est activé à l'aide de la requête ci-dessous
set lines 180col module for a45col sql_trace_waits for a20col sql_trace_binds for a20col sql_trace for a20select username,module,sid,sql_trace,sql_trace_waits,sql_trace_binds from v$session where sql_trace='ENABLED'/
S'il est activé par d'autres méthodes, la seule façon de vérifier est de regarder l'emplacement de la trace et de trouver les fichiers de trace récents, puis de trouver le sid et le numéro de série, puis vous pouvez interroger v $ session pour trouver le session et vous pouvez désactiver la trace si vous le souhaitez
Utilitaire Oracle tkprof
Les fichiers de trace obtenus à partir de la méthode ci-dessus sont sous forme brute et peuvent être convertis dans un format plus lisible à l'aide de l'utilitaire tkprof (utilitaire Transient Kernel PROFile)
tkprofUsage :tkprof tracefile outputfile [explain=] [table=][print=] [insert=] [sys=] [sort=]table=schema.tablename Utilisez 'schema.tablename' avec l'option 'explain='. expliquer=utilisateur/mot de passe Connectez-vous à ORACLE et lancez EXPLAIN PLAN.print=integer Répertorier uniquement les premières instructions SQL "entières". instructions exécutées en tant qu'utilisateur SYS.record=filename Enregistre les instructions non récursives trouvées dans le fichier de trace.waits=yes|no Enregistre le résumé de tous les événements d'attente trouvés dans le fichier de trace.sort=option Ensemble de zéro ou plusieurs des options de tri suivantes :prscnt nombre de fois que l'analyse a été appeléeprscpu Temps CPU parsingprsela temps écoulé d'analyse prsdsk nombre de lectures de disque pendant l'analyse prsqry nombre de tampons pour une lecture cohérente pendant l'analyse parseprscu nombre de tampons pour la lecture actuelle pendant l'analyse prseprsmis nombre d'échecs dans le cache de la bibliothèque pendant l'analyse parseexecnt nombre d'ex ecute s'appelait execpu Temps CPU passé à exécuter exeela Temps écoulé à exécuter exedsk Nombre de lectures de disque pendant l'exécution exeqry Nombre de tampons pour une lecture cohérente pendant l'exécutionexecu Nombre de tampons pour la lecture en cours pendant l'exécutionexerow Nombre de lignes traitées pendant l'exécutionexemis Nombre de caches de bibliothèque manquants pendant l'exécution fchcnt Nombre nombre de fois où l'extraction a été appeléefchcpu temps CPU passé à récupérerfchela temps écoulé fetchingfchdsk nombre de lectures de disque pendant fetchfchqry nombre de tampons pour une lecture cohérente pendant fetchfchcu nombre de tampons pour la lecture actuelle pendant fetchfchrow nombre de lignes extraitesuserid ID utilisateur de l'utilisateur qui a analysé le curseur
Quelques exemples
tkprof file.trc file.txt sys=no expliquer=ID utilisateur/mot de passe sort=prsela,exeela,fchelatkprof fichier.trc fichier.txt sys=no expliquer=ID utilisateur/mot de passe sort=prsela,exeela,fchelatkprof fichier.trc fichier .txt sys=notkprof file.trc file.txt sys=no expliquer=ID utilisateur/mot de passe sort=prsela,exeela,fchelaCette impression 10 sql uniquement tkprof .trc elaps.prf sys=no expliquer=apps/ sort=(prsela,exeela,fchela) print=10Ceci imprime tout le sql tkprof .trc elaps.prf sys=non expliquer=apps/apps sort=prsela,exeela,fchela
Exemple de contenu du fichier tkprof
TKPROF :Version 11.2.0.4.0 - Production le Mar 17 janvier 14:12:41 2013Copyright (c) 1982, 2007, Oracle. Tous droits réservés.Fichier de trace :TEST_ora_15941.trcOptions de tri :execpu fchcpu************************************ ********************************************comptage =nombre de fois OCI la procédure a été exécutéeCPU (/ | traité par l'appel d'extraction ou d'exécution******************************************* *************************************ID SQL :6w82ggrtysxPlan de hachage :2325776775SELECT FUNCTION_NAME FROM FND_USER_DESKTOP_OBJECTS WHERE USER_ID =:b1 AND APPLICATION_ID =:b2 AND RESPONSIBILITY_ID =:b3 AND TYPE ='FUNCTION' AND ROWNUM <=10 ORDER BY SEQUENCEcall count cpu durée disk query current rows------- ------ ------ ---- ---------- ---------- ---------- ---------- ---------- Parse 1 0,00 0,00 0 0 0 0 EXECUTE 1 0,00 0,00 0 0 0 0 Fetch 2 0,00 0,00 0 4 0 1 ------- ------ ----- --- ---------- ---------- ---------- ---------- ------- ---total 4 0,00 0,00 0 4 0 1 Manque dans le cache de la bibliothèque pendant l'analyse :0 Mode d'optimisation :ALL_ROWSParsing user id :173 (APPS) --------- ---------- ---------- --------------------- ------------------------------1 1 1 SORT ORDER BY (cr=4 pr=0 pw=0 time=0 us cost=6 size=41 card=1)1 1 1 COUNT STOPKEY (cr=4 pr=0 pw=0 time=0 us)1 1 1 TABLE ACCESS BY INDEX ROWID FND_USER_DESKTOP_OBJECTS (cr=4 pr=0 pw=0 time =0 coût us=5 taille=41 carte=1)1 1 1 PLAGE D'INDICE S CAN FND_USER_DESKTOP_OBJECTS_N1 (cr=3 pr=0 pw=0 time=0 us cost=3 size=0 card=3)(object id 33596)Lignes Plan d'exécution------- --------- ------------------------------------------0 SÉLECTIONNER L'INSCRIPTION MODE :ALL_ROWS1 SORT ( ORDER BY)1 COUNT (STOPKEY)1 TABLE ACCESS MODE :ANALYSED (BY INDEX ROWID) OF'FND_USER_DESKTOP_OBJECTS' (TABLE)1 INDEX MODE :ANALYSED (RANGE SCAN) OF'FND_USER_DESKTOP_OBJECTS_N1' (INDEX)Les temps écoulés incluent l'attente des événements suivants :Événement attendu le Fois Max. Attendre Total Attendu---------------------------------------- Attendu ------ ---- ------------ Message SQL*Net au client 5 0,00 0,00Message SQL*Net du client 5 0,00 0,00**************** ****************************************************** **************ID SQL :276ut2ywquxPlan Hash :3856112528select object_name, icon_namefromfnd_desktop_objectscall count cpu écoulé disk query current rows------- ------ ------ -- ---------- ---------- ---------- ---------- -------- - Parse 1 0,00 0,00 0 0 0 0 EXECUTE 1 0,00 0,00 0 0 0 0 Fetch 3 0,00 0,00 0 6 0 47 ------- ------ -------- ----- ----- ---------- ---------- ---------- ----------total 5 0,00 0,00 0 6 0 47Manques dans le cache de la bibliothèque d uring parse :0Optimizer mode :ALL_ROWSParsing user id :173 (APPS)Nombre de statistiques de plan capturées :1Rows (1st) Rows (avg) Rows (max) Row Source Operation---------- ----- ----- ---------- ----------------------------------- ----------------47 47 47 ACCÈS À LA TABLE FULL FND_DESKTOP_OBJECTS (cr=6 pr=0 pw=0 time=0 us cost=2 size=1175 card=47)Lignes Plan d'exécution ------- ------------------------------------------- --------0 SELECT STATEMENT MODE :ALL_ROWS47 TABLE ACCESS MODE :ANALYSED (FULL) OF 'FND_DESKTOP_OBJECTS'(TABLE)
Oracle trcses utilitaire
Lors de l'utilisation de sessions de serveur partagées, de nombreux processus sont impliqués. La trace relative à la session utilisateur est dispersée dans différents fichiers de trace appartenant à différents processus. Il est donc difficile d'obtenir une image complète du cycle de vie d'une session.
L'utilitaire trcsess consolide la sortie de trace des fichiers de trace sélectionnés en fonction de plusieurs critères
trcsess [output=output_file_name] [session=session_id] [clientid=client_id] [service=service_name] [action=action_name] [module=module_name] [trace_files]trcsess output=main.trc service=TEST *trcUne fois le fichier de trace de consolidation généré, vous pouvez exécuter tkprof dessus.
Plus d'informations
Dans 11g et supérieur, sql_trace est également un événement et peut être défini avec la syntaxe de l'événement :
SQL> oradebug doc event name sql_tracesql_trace :événement pour sql traceUsage-------sql_tracewait, lier ,plan_stat ,niveau Vous pouvez donc l'utiliser comme suit pour activer SQL_TRACE demandant des informations de liaison :
modifier les événements d'ensemble de session 'sql_trace bind=true' ;ou lier et attendre les informations (notez séparées par des virgules) :
modifier les événements d'ensemble de session 'sql_trace bind=true, wait=true' ;Une trace supplémentaire peut être limitée à un ensemble de SQL_ID si vous incluez un filtre pour celui-ci. Par exemple
modifier les événements d'ensemble de session 'sql_trace [sql :sql_id=g3yc1js3g2689 | sql_id=7ujay4u33g337]bind=true, wait=true';10046 niveaux EVENT :(les nouvelles valeurs sql_trace sont incluses dans [..])
Il s'agit de valeurs binaires qui peuvent donc être assemblées pour obtenir différents mélanges
1 – Activer la fonctionnalité SQL_TRACE standard (par défaut)
4 – En tant que valeurs de liaison de suivi de niveau 1 PLUS [ bind=true ]
8 – En tant qu'attente de trace de niveau 1 PLUS [wait=true]
Ceci est particulièrement utile pour repérer l'attente du verrou, etc.
mais peut également être utilisé pour repérer les balayages de table complets et les balayages d'index.À partir de la version 11g, ces niveaux de bits supplémentaires sont disponibles :
16 – Générer des vidages de ligne STAT pour chaque exécution [ plan_stat=all_executions ]
32 – Ne jamais vider les statistiques d'exécution [ plan_stat=never ]Depuis la version 11.2.0.2, ce niveau de bits supplémentaire est disponible :
64 – Vidage adaptatif des lignes STAT. [ plan_stat=adaptive ]
Cela vide les informations STAT si un SQL a pris plus d'environ 1 minute,
donnant ainsi des informations pour les SQL les plus coûteux et pour différentes exécutions de ces
SQL.Par exemple :un niveau d'événement courant est 12, qui inclut la sortie SQL_TRACE standard, les liaisons, les attentes et
le suivi de ligne STAT par défaut.Remarques :
Le vidage STAT a été modifié dans la version 11g afin qu'il ne soit pas agrégé pour toutes les exécutions, mais qu'il soit vidé après l'exécution. Cela a été fait pour traiter les cas où le curseur n'est pas fermé et les informations STAT ne sont donc pas vidées.
Maintenant, nous garantissons la capture des informations STAT après l'exécution. Voir les niveaux de bits ci-dessus pour avoir un contrôle plus précis sur les lignes STAT.Lit également
v$active_session_history
expliquer le plan dans Oracle
sql tuning Advisor