深入理解Oracle除錯事件:10046事件詳解
之前也寫過一篇10046的文章:10046簡介
今天,Think想和大家一起共同深入去理解一下Oracle的這些除錯事件
10046事件是SQL_TRACE的擴充套件,被戲稱為"吃了興奮劑的SQL_TRACE"
有效的追蹤級別:
① 0級:SQL_TRACE=FASLE
② 1級:SQL_TRACE=TRUE,這是預設級別
③ 4級:1級+繫結變數
④ 8級:4級+等待事件
⑤ 12級:4級+8級
對於4級的10046,若用tkprof格式化,則會隱藏每一點SQL語句在做什麼以及怎麼做
對於8級的10046,等待事件散得到處多是,此時我們不妨用tkprof對等待事件進行彙總
所以,理解擴充套件SQL跟蹤檔案的格式,是每一個面臨效能問題或故障排除任務的DBA的必備技能
㈠ 為什麼需要10046?
對一個擁有alter session許可權但是沒有被授權DBA角色的資料庫使用者
alter session set events是在他自己會話中啟動擴充套件SQL跟蹤的唯一方法
透過這種方法將等待事件或者繫結變數包含在SQL跟蹤檔案中,然後進行最佳化或者錯誤診斷
10046 看到語句的執行過程,知道語句的執行計劃,包括各種步驟,關聯方式,分別在哪些步驟耗時多少,有哪些等待事件等
這些都是最佳化的基礎,知道這些,就知道該如何最佳化以及troubleshoting
㈡ 如何獲取trc檔案?
這裡主要介紹3種方法
① 使用tracefile_identifier,比如:
alter session set tracefile_identifier=\'Think\'
② oradebug,詳細請請參看Think之前的一篇部落格:oradebug
③ 使用下面的指令碼:
hr@ORCL> ed Wrote file afiedt.buf 1 select 2 d.value||\'/\'||lower(rtrim(i.instance, chr(0)))||\'_ora_\'||p.spid||\'.trc\' trace_file_name 3 from 4 ( select p.spid 5 from v$mystat m,v$session s,v$process p 6 where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p, 7 ( select t.instance from v$thread t,v$parameter v 8 where v.name = \'thread\' and (v.value = 0 or t.thread# = to_number(v.value))) i, 9* ( select value from v$parameter where name = \'user_dump_dest\') d hr@ORCL> / TRACE_FILE_NAME ----------------------------------------------------------------- /u01/app/oracle/admin/orcl/udump/orcl_ora_4012.trc
㈢ 如何讀懂10046事件的檔案?
① 資料庫呼叫
含3個子分類:解析,執行和獲取
這3個分類與透過呼叫DBMS_SQL的子例程DBMS_SQL.PARSE,DBMS_SQL.EXECUTE,DBMS_SQL.FETCH_ROWS來跑SQL的步調相一致
解析
解析在跟蹤檔案中通常透過兩個相鄰的條目表示
第一個是PARSING IN CURSOR,第二個是PARSE
PARSING IN CURSOR #9 len=28 dep=0 uid=55 oct=2 lid=55 tim=1327904235010505 hv=119728103 ad=\'2fc6ae84\' insert into t values(\'ooxx\') END OF STMT PARSE #9:c=52003,e=65698,p=0,cr=30,cu=0,mis=1,r=0,dep=0,og=1,tim=1327904235010494
執行和獲取同解析在格式上是一樣的,這裡就不贅述了
② commit和rollback和XCTEND條目格式
XCTEND rlbk=0, rd_only=0
Oracle不需要客戶端顯示地開始一個事務,DBMS在第一個資料專案被修改或分散式操作執行後會自動開啟一個事務
比如,透過dblink從一個表執行select
在trc中事務的邊界透過XCTEND條目標記,格式如下:
XCTEND rlbk=[0-1],rd_only=[0-1]
③ 執行計劃,統計資訊與STAT條目格式
STAT條目報告了執行計劃和統計資訊
STAT #6 id=1 cnt=0 pid=0 pos=1 obj=18 op=\'TABLE ACCESS BY INDEX ROWID OBJ$ (cr=2 pr=0 pw=0 time=194 us)\' STAT #6 id=2 cnt=0 pid=1 pos=1 obj=37 op=\'INDEX RANGE SCAN I_OBJ2 (cr=2 pr=0 pw=0 time=95 us)\'
一組STAT條目的每一行代表了形成語句結果的行源
所謂的行源,指從索引或表中檢索的資料或者多表連線的中間結果(因為必須先進行兩表連線)
10g以後,STAT條目僅在TIMED_STATISTICS=TRUE,並且SQL_TRACE=TRUE時才被寫入
請注意,若STATISTICS_LEVEL=BASIC(預設為TYPICAL)時會隱式設定TIMED_STATISTICS=FASLE
④ 等待事件和WAIT條目格式
WAIT #9: nam=\'SQL*Net message to client\' ela= 4 driver id=1650815232 #bytes=1 p3=0 obj#=52523 tim=1327922883350249 WAIT #9: nam=\'SQL*Net message from client\' ela= 301 driver id=1650815232 #bytes=1 p3=0 obj#=52523 tim=1327922883350743 WAIT #11: nam=\'db file sequential read\' ela= 253 file#=1 block#=420 blocks=1 obj#=355 tim=1327923455671258 WAIT #11: nam=\'db file sequential read\' ela= 7073 file#=1 block#=43998 blocks=1 obj#=355 tim=1327923455678537 WAIT #11: nam=\'db file sequential read\' ela= 91 file#=1 block#=43999 blocks=1 obj#=355 tim=1327923455678836 WAIT #11: nam=\'db file sequential read\' ela= 14433 file#=1 block#=53521 blocks=1 obj#=355 tim=1327923455693393
⑤ 繫結變數和BINDS條目格式
繫結變數的詳細資訊包括繫結變數的資料型別和值
透過這些資訊我們可以得到最大化的診斷
例如,索引列的資料型別與繫結變數的資料型別不匹配,導致索引失效,CPU使用率增加,因為還存在隱式資料型別轉換
一個BINDS條目的結構由後面跟著遊標編號的單詞BINDS和每一個繫結變數單獨的子部分組成
BINDS #9: kkscoacd Bind#0 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0 kxsbbbfp=b7ee5a5c bln=22 avl=02 flg=05 value=20 Bind#1 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0 kxsbbbfp=b7ee5a38 bln=24 avl=02 flg=05 value=3
當將繫結變數與子部分相關聯時,不用關心數字,他們會被包含在繫結變數的名稱中,例如 ":B1"
hr@ORCL> select dump(employee_id) from employees where rownum=1; DUMP(EMPLOYEE_ID) ---------------------------------------------------------------------------------------------------- Typ=2 Len=2: 194,2
這裡的Typ就是資料型別編號
下次Think再把最佳化或者診斷的案例給附上,此文未完待續哦,,
相關文章
- 10046事件概述事件
- 除錯篇——除錯物件與除錯事件除錯物件事件
- 刪除事件(解綁事件)/ 刪除事件相容性解決方案事件
- 深入理解DOM事件機制事件
- 委託與事件-事件詳解(二)事件
- nodejs事件和事件迴圈詳解NodeJS事件
- 10.0 探索API除錯事件原理API除錯事件
- Js 事件詳解JS事件
- DOM 事件詳解事件
- JavaScript事件詳解JavaScript事件
- 深入理解React:事件機制原理React事件
- 深入理解非同步事件機制非同步事件
- 深入理解Spring的事件通知機制Spring事件
- 事件迴圈詳解事件
- 10.1 除錯事件讀取暫存器除錯事件
- 深入理解事件機制的實現事件
- 詳解 Solidity 事件Event - 完全搞懂事件的使用Solid事件
- 深入理解Android逆向除錯原理Android除錯
- [20180417]使用10046事件需要什麼許可權.txt事件
- Spring事件機制詳解Spring事件
- Redis 事件機制詳解Redis事件
- Android輸入事件詳解Android事件
- 10.3 除錯事件轉存程式記憶體除錯事件記憶體
- 原生js頁面事件詳解JS事件
- Vue事件修飾符詳解Vue事件
- React 進階(四)事件詳解React事件
- 理解js的事件冒泡和事件捕獲JS事件
- 對 Node.js 事件驅動模型的深入理解Node.js事件模型
- Oracle 10046 SQL TRACEOracleSQL
- 【TUNE_ORACLE】等待事件之等待事件類別Oracle事件
- 詳解C#委託與事件C#事件
- JavaScript 事件迴圈詳解(翻譯)JavaScript事件
- android事件分發機制詳解Android事件
- 事件委託詳解最新版事件
- Vue入門—事件與方法詳解Vue事件
- 深入瞭解nodejs的事件迴圈機制NodeJS事件
- Blocks深入理解和詳解BloC
- GDB除錯命令詳解除錯
- ORACLE 常見等待事件Oracle事件