Tracering is een belangrijk onderdeel voor het afstemmen van Oracle-databases. Dit helpt bij het vastleggen van alle probleemstellingen en wait-gebeurtenissen die verantwoordelijk zijn voor het trage verloop van de sessie.
De Oracle-database heeft veel snelste manieren geboden om de lokale sessie en andere gebruikerssessies te traceren en de tracering op te maken zodat deze leesbaar is
br/>
Laten we eens kijken hoe u SQL-tracering, 10046-gebeurtenis in Oracle-database en trcsess, tkprof-hulpprogramma inschakelt
Inhoudsopgave
SQL Trace, 100046-gebeurtenis
Als u in lokale sessie wilt traceren, volgen hier de stappen om SQL-tracering in te schakelen
Normaal spoor sessieset wijzigen sql_trace =true; -- Om de tracering op een andere sessie te zetten, set sql_trace =false; -- Om tracering uit te zettenVolledig niveau met wait-gebeurtenis En tracering binden alter session set events ='10046 trace name context forever, level 12';Om het traceren van offalter session set events ='10046 trace name context off' te zetten;Hetzelfde als normaal traceren exec DBMS_SESSION.set_sql_trace(sql_trace => TRUE);exec DBMS_SESSION.set_sql_trace(sql_trace => FALSE);
Als je in een andere hardloopsessie wilt traceren, volgen hier de stappen
Normaal spoor voer dbms_system.set_sql_trace_in_session uit ('sid','serial',true); -- Om tracering onuitvoerbaar te maken, voert u dbms_system.set_sql_trace_in_session ('sid','serial',true) uit; -- Traceren uitschakelenVolledig niveau met wait-gebeurtenis En tracering binden execute dbms_system.set_ev(‘sid’,’serial’,10046,12,’’);Om tracering uit te zetten execute dbms_system.set_ev(‘sid’,’serial’,10046,0,’’);
U moet 12,0 hebben gezien in verschillende bovenstaande verklaringen. Het zijn traceerniveaus. Oracle Tracing heeft traceringsniveaus. Dit zijn de geldige waarden
0 | Geen spoor. Zoals het uitschakelen van sql_trace. |
2 | Het equivalent van gewone sql_trace Het biedt een uitvoeringspad, aantal rijen en het kleinste platte bestand Voordelen Biedt uitvoeringspad Biedt rijtellingen Produceert kleinste platte bestand Nadelen Kan niet zeggen welke waarden tijdens runtime aan SQL zijn geleverd Als de statistieken voor de query laag zijn maar de runtime lang is, kan ik niet zien welke gebeurtenissen het lange wachten hebben veroorzaakt |
4 | Hetzelfde als 2, maar met de toevoeging van waarden voor bindingsvariabelen Voordelen Geeft uitvoeringspad Geeft rijtellingen Kan zien voor welke waarden de instructie is uitgevoerd Nadelen Nogmaals, als de looptijd lang is en de statistieken laag zijn, zal het moeilijk zijn om te zeggen waarom in dit type tracering. Produceert een groter plat bestand dan de normale trace, omdat variabele bindinformatie moet worden opgeslagen. /td> |
8 | Hetzelfde als 2, maar met de toevoeging van wachtgebeurtenissen Regular Trace plus databasebewerkingstimings waarop de SQL heeft gewacht om te voltooien. Bijvoorbeeld:timings voor schijftoegang. Voordelen Biedt uitvoeringspad Biedt rijtellingen Kan timings bepalen voor alle gebeurtenissen die aan SQL zijn gekoppeld. Nadelen Trace-bestand kan gemakkelijk maximaal zijn vanwege alle informatie die Oracle naar het trace-bestand moet schrijven en dan is er slechts gedeeltelijke informatie beschikbaar in het trace-bestand. Bind-variabele-informatie is niet beschikbaar |
12 | Hetzelfde als 2, maar met zowel bindingsvariabelen als wachtgebeurtenissen Regelmatige tracering met zowel de wacht- als de bindingsinformatie. Bevat de meest volledige informatie en zal het grootste traceringsbestand produceren. Biedt uitvoeringspad Biedt rijtellingen Kan timings bepalen voor alle gebeurtenissen die aan SQL zijn gekoppeld. Kan vertellen welke waarden de SQL werd uitgevoerd met Voordelen Biedt uitvoeringspad Biedt rijtellingen Kan de timing bepalen voor alle gebeurtenissen die aan SQL zijn gekoppeld. Kan zien met welke waarden de SQL is uitgevoerd Nadelen Trace-bestand kan gemakkelijk zijn maximum bereiken vanwege alle informatie die Oracle naar het trace-bestand moet schrijven en dan is er slechts gedeeltelijke informatie beschikbaar in het trace-bestand. |
Er zijn ook andere manieren om de tracering te doen. Hier zijn enkele van deze
(1) ORADEBUG
Hiervoor is inloggen als sysdba vereist
oradebug setospid 1111 -- Foutopsporingssessie met het opgegeven Oracle-proces idoradebug setorapid 1111 --- Foutopsporingssessie met de opgegeven besturingssysteem-processoradebug-gebeurtenis 10046 traceernaamcontext voor altijd, niveau 4;oradebug-gebeurtenis 10046 traceernaamcontext uit; --- Dit schakelt de traceoradebug close_trace uit --- Dit sluit het traceerbestandOradebug TRACEFILE_NAME;
(2) Met Oracle 10g zijn de SQL-traceeropties uitgebreid met het DBMS_MONITOR-pakket
EXECUTE dbms_monitor.session_trace_enableWhich is vergelijkbaar;EXECUTE dbms_monitor.session_trace_enable (waits=>true);Dat is vergelijkbaar 'sid','serial',10046,2,'');EXECUTE dbms_monitor.session_trace_enable ('sid','serial#',binds=>true);Dat is vergelijkbaarexecute dbms_system.set_ev('sid','serial' ,10046,4,'');EXECUTE dbms_monitor.session_trace_enable ('sid','serial#',waits=>true);Dat is vergelijkbaarexecute dbms_system.set_ev('sid','serial',10046,8,'' );
Er zijn veel andere functies beschikbaar in dbms_monitor. We kunnen tracering inschakelen op basis van klant-ID en meerdere manieren
Hoe de Trace-bestanden te identificeren
We kunnen de traceerbestanden identificeren met behulp van de spid van de sessie. Het traceerbestand bevat ook sid,serial# pair aan het begin van het traceerbestand.
De onderstaande zoekopdracht kan worden gebruikt om het lokale sessietraceerbestand te vinden
selecteer c.waarde || '/' || d.instance_name ||'_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') en c.name ='user_dump_dest'/
Er is nog een eenvoudige manier om het traceerbestand te identificeren, dat traceer-ID wordt genoemd
sessieset wijzigen tracefile_identifer=’ORAC’; Dit is identificatie
Voorbeeld traceerbestand
Traceerbestand /app/oracle/TEST/diag/rdbms/test/TEST/trace/TEST_ora_13025_IDEN.trcOracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64-bits productieMet de partitionering, echte applicatieclusters, OLAP, datamining en Real Application Testing optionsORACLE_HOME =/app/oracle/TEST/11.2.0/dbSystem name: SunOS12Node name:sun12Release: 5.10Version: Generic_144488-11Machine: sun4uInstance name:TESTRedo-thread gemonteerd door deze instantie:1Oracle-procesnummer:20225Unix-proces pid:20225Unix-proces , afbeelding:[email protected] SunOS12*** 2013-10-21 12:28:56.461*** SESSIE-ID:(3875.17341) 2013-10-21 12:28:56.461*** KLANT-ID:() 2013 -10-21 12:28:56.461*** SERVICENAAM:(TEST) 2013-10-21 12:28:56.461*** MODULENAAM:([email protected](TNS V1-V3)) 2013-10 -21 12:28:56.461*** ACTIENAAM:() 2013-10-21 12:28:56.461CLOSE #4:c=0,e=11,dep=1,type=1,tim=8866891135825=====================PASEREN IN CURSOR #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=====================PASEREN IN CURSOR #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 IS NIET NULLEND VAN STMTBINDS #4:Bind=#0oacdty 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 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) mxl =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( ) 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=====================PASEREN IN CURSOR #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 WHEREID PROFILE_OPTION_==LEVEL_VALUE =:B1 EN PROFILE_OPTION_VALUE IS NIET NULLEND VAN 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 =00 maat=0 off=48kxsbbbfp=ffffffff7d673ba8 bln=22 avl=04 flg=01value=1001
hoe te controleren of traceren is ingeschakeld in orakel
Als u tracering hebt ingeschakeld met behulp van het DBMS_MONITOR-pakket, kunnen we controleren of tracering is ingeschakeld met behulp van onderstaande query
stel regels 180col module in voor a45col sql_trace_waits voor a20col sql_trace_binds voor a20col sql_trace voor a20select gebruikersnaam,module,sid,sql_trace,sql_trace_waits,sql_trace_binds van v$session waar sql_trace='ENABLED'/
Als het is ingeschakeld via andere methoden, dan is de enige manier om te controleren, kijken naar de traceerlocatie en de trace-bestanden vinden die recent zijn en dan de sid en serial# erin vinden en dan kun je v$session opvragen om de sessie en u kunt de tracering desgewenst uitschakelen
Oracle tkprof-hulpprogramma
De traceerbestanden die met de bovenstaande methode zijn verkregen, zijn in onbewerkte vorm en kunnen worden geconverteerd naar een beter leesbaar formaat met het hulpprogramma tkprof (hulpprogramma Transient Kernel PROFile)
tkprofUsage:tkprof tracefile outputfile [explain=] [table=][print=] [insert=] [sys=] [sort=]table=schema.tablename Gebruik 'schema.tablename' met 'explain=' optie. explain=user/password Maak verbinding met ORACLE en geef de opdracht EXPLAIN PLAN.print=integer Geef alleen de eerste 'integer' SQL-statements weer.aggregate=yes|noinsert=filename Geef SQL-statements en gegevens weer binnen INSERT-statements.sys=no TKPROF vermeldt geen SQL instructies worden uitgevoerd als gebruiker SYS.record=bestandsnaam Neem niet-recursieve instructies op die in het traceerbestand zijn gevonden. :prscnt aantal keren dat parse werd aangeroepenprscpu CPU-tijd parsingprsela verstreken tijd parsing prsdsk aantal schijfleesbewerkingen tijdens parseren prsqry aantal buffers voor consistent lezen tijdens parseprscu aantal buffers voor huidige leesbewerkingen tijdens parseprsmis aantal missexe in bibliotheek tijdens parseren ecute heette execpu CPU-tijd besteed aan het uitvoeren van exeela verstreken tijd aan het uitvoeren van exedsk aantal schijflezingen tijdens uitvoering exeqry aantal buffers voor consistent lezen tijdens executeexecu aantal buffers voor huidige lezen tijdens executeexerow aantal rijen verwerkt tijdens executeexemis aantal bibliotheekcache missers tijdens executefchcnt aantal vaak werd fetch genoemdfchcpu cpu-tijd besteed aan fetchingfchela verstreken tijd fetchingfchdsk aantal schijflezen tijdens fetchfchqry aantal buffers voor consistent lezen tijdens fetchfchcu aantal buffers voor huidige leestijd tijdens fetchfchrow aantal rijen fetcheduserid userid van gebruiker die de cursor heeft ontleedEnkele voorbeelden
tkprof file.trc file.txt sys=no explain=userid/password sort=prsela,exeela,fchelatkprof file.trc file.txt sys=no explain=userid/password sort=prsela,exeela,fchelatkprof file.trc file .txt sys=notkprof file.trc file.txt sys=no explain=userid/password sort=prsela,exeela,fchelaDeze print alleen 10 sql tkprof .trc elaps.prf sys=no explain=apps/ sort=(prsela,exeela,fchela) print=10Dit drukt alle sql af tkprof .trc elaps.prf sys=no explain=apps/apps sort=prsela,exeela,fchelaVoorbeeld inhoud van tkprof-bestand
TKPROF:Release 11.2.0.4.0 - Productie op di 17 jan 14:12:41 2013Copyright (c) 1982, 2007, Oracle. Alle rechten voorbehouden. Traceerbestand:TEST_ora_15941.trcSorteeropties:execpu fchcpu************************************ ***************************************** tellen =aantal keren OCI procedure werd uitgevoerdCPU =CPU-tijd in seconden Executingelapsed =verstreken tijd in seconden Executingdisk =aantal fysieke leesbewerkingen van buffers van diskquery =aantal buffers verkregen voor consistente leesstroom =aantal buffers verkregen in huidige modus (meestal voor update)rijen =aantal rijen verwerkt door het ophalen of uitvoeren van de oproep ***************************************** **************************************** SQL-ID:6w82ggrtysxPlan Hash: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 SEQUENCE oproep count cpu verstreken schijf ---- ---------- ---------- ---------- ---------- ---------- PARSE 1 0.00 0.00 0 0 0 0EXECUTE 1 0.00 0.00 0 0 0 0 0Fetch 2 0.00 0.00 0 4 0 1 ------- ------ ----- --- ---------- ---------- ---------- ---------- ------- ---total 4 0.00 0.00 0 4 0 1Missingen in bibliotheekcache tijdens parseren:0Optimizer-modus:ALL_ROWSParsing-statistieken:(APP-ID) Nummering:1 --------- ---------- ---------- --------------------- ------------------------------1 1 1 SORTEREN OP (cr=4 pr=0 pw=0 tijd=0 us 0 ww =6 size=41 card=1)1 1 1 COUNT STOPKEY (cr=4 pr=0 pw=0 time=0 us)1 1 1 TAFELTOEGANG DOOR INDEX ROWID FNDP_USEROB_DE tijd (cr=4 pr=0 pw=0 time=0 us) =0 us cost=5 size=41 card=1)1 1 1 INDEX RANGE S CAN FND_USER_DESKTOP_OBJECTS_N1 (cr=3 pr=0 pw=0 tijd=0 us cost=3 size=0 card=3)(object id 33596) Rijen Uitvoeringsplan ------- --------- ------------------------------------------0 SELECTEER STATEMENT MODUS:ALLE RIJEN1 SORTEREN ( ORDER BY)1 COUNT (STOPKEY)1 TAFELTOEGANG MODUS:ANALYZED (BY INDEX ROWID) OF'FND_USER_DESKTOP_OBJECTS' (TABLE)1 INDEX MODE:ANALYZED (RANGE SCAN) OF'FND_USER_DESKTOP_OBJECTS' (TABLE)1 INDEX MODE:ANALYZED (RANGE SCAN) OF'SKTO_USEROBJECTS' Evenement gewacht op Tijden Max. Wacht Totaal gewacht ---------------------------------------- Wachtte ------ ---- ------------SQL*Net-bericht naar klant 5 0.00 0.00SQL*Net-bericht van klant 5 5 0,00 ********************************************** *************** SQL-ID:276ut2ywquxPlan Hash:3856112528select object_name, icon_namefromfnd_desktop_objectscall count cpu verstreken schijf query huidige rijen -------- ------- -- ---------- ---------- ---------- ---------- -------- -PARSE 1 0.00 0.00 0 0 0 0 0EXECUTE 1 0.00 0.00 0 0 0 0 0Fetch 3 0.00 0.00 0 6 0 47 ------- ------ -------- ----- ----- ---------- ---------- --------- ---------- totaal 5 0,00 0,00 0 6 0 47Missen in bibliotheekcache d uring parseren:0Optimizer-modus:ALL_ROWSParsing gebruikers-ID:173 (APPS)Aantal vastgelegde planstatistieken:1Rijen (1e) Rijen (gem) Rijen (max) Rijbronbewerking ---------- ----- ----- ---------- ----------------------------------- ----------------47 47 47 TAFELTOEGANG VOLLEDIG FND_DESKTOP_OBJECTS (cr=6 pr=0 pw=0 tijd=0 us cost=2 size=1175 card=47)Rijen Uitvoeringsplan ------- ------------------------------------------- --------0 SELECTEER STATEMENT MODUS:ALL_ROWS47 TAFELTOEGANG MODUS:GEANALYSEERD (VOLLEDIG) VAN 'FND_DESKTOP_OBJECTS'(TABEL)Oracle trcsess hulpprogramma
Bij het gebruik van gedeelde serversessies zijn veel processen betrokken. De tracering met betrekking tot de gebruikerssessie is verspreid over verschillende traceringsbestanden die bij verschillende processen horen. Dit maakt het moeilijk om een volledig beeld te krijgen van de levenscyclus van een sessie.
Het hulpprogramma trcsess consolideert de traceeruitvoer van geselecteerde traceerbestanden op basis van verschillende criteriatrcsess [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 *trcNadat het geconsolideerde traceerbestand is gegenereerd, kunt u tkprof erop uitvoeren.
Meer informatie
In 11g en hoger is sql_trace ook een gebeurtenis en kan worden ingesteld met gebeurtenissyntaxis:
SQL> oradebug doc gebeurtenisnaam sql_tracesql_trace:gebeurtenis voor sql traceUsage-------sql_tracewait,bind ,plan_stat ,niveau U kunt het dus als volgt gebruiken om SQL_TRACE in te schakelen die bindinformatie opvraagt:
wijzig sessieset-gebeurtenissen 'sql_trace bind=true';of bind en wacht informatie (let op komma gescheiden):
wijzig sessieset-gebeurtenissen 'sql_trace bind=true, wait=true';Verdere tracering kan worden beperkt tot een set SQL_ID's als u er een filter voor opneemt. Bijv.
wijzig sessieset-gebeurtenissen 'sql_trace [sql:sql_id=g3yc1js3g2689 | sql_id=7ujay4u33g337]bind=true, wait=true';10046 EVENT-niveaus:(de nieuwe sql_trace-waarden zijn opgenomen in [..])
Dit zijn bitwaarden en kunnen dus worden samengevoegd om verschillende mixen te krijgen
1 – Standaard SQL_TRACE-functionaliteit inschakelen (standaard)
4 – Als niveau 1 PLUS traceerbindwaarden [bind=true]
8 – Als Level 1 PLUS-tracering wacht [ wait=true ]
Dit is vooral handig voor het opsporen van latch wait enz.
maar kan ook worden gebruikt om volledige tafelscans en indexscans te detecteren.Vanaf 11g zijn deze extra bitniveaus beschikbaar:
16 – Genereer STAT-regeldumps voor elke uitvoering [ plan_stat=all_executions ]
32 – Dump nooit uitvoeringsstatistieken [ plan_stat=never ]Vanaf 11.2.0.2 is dit extra bitniveau beschikbaar:
64 – Adaptieve dump van STAT-lijnen. [ plan_stat=adaptive ]
Hiermee wordt de STAT-informatie gedumpt als een SQL meer dan ongeveer 1 minuut duurde, waardoor
informatie wordt gegeven voor de duurdere SQL's en voor verschillende uitvoeringen van dergelijke
SQL's.bijv.:Een veelvoorkomend gebeurtenisniveau is 12, inclusief standaard SQL_TRACE-uitvoer, binds, waits en
standaard STAT-regeltracering.Opmerkingen:
STAT-dumping is gewijzigd in 11g, zodat ze niet voor alle uitvoeringen worden geaggregeerd, maar na uitvoering worden gedumpt. Dit is gedaan om gevallen aan te pakken waarin de cursor niet is gesloten en de STAT-informatie daarom niet wordt gedumpt.
Nu garanderen we dat we de STAT-informatie na de uitvoering vastleggen. Bekijk de bovenstaande bitniveaus voor meer controle over STAT-lijnen.Leest ook
v$active_session_history
plan uitleggen in Oracle
sql tuning Advisor