oracle實用工具:oradebug

不一樣的天空w發表於2017-07-07
1、 oradebug介紹
oradebug主要是給Oracle支援人員使用的,儘管很早便有,但oracle官網很少有記載。他是個sql*plus命令列工具,有sysdba的許可權就可以登入,無需特別設定。他可以被用於:

 1)追蹤程式,或者是你的,或者是外部的
  2)確定程式往哪個trc檔案寫
  3)轉儲:資料檔案頭、內部oracle結構等
  4)掛起程式,暫時的
  5)確定例項使用了哪些共享記憶體塊和訊號量
  6)找出RAC例項使用了哪些互聯地址和協議
  7)修改SGA中的資料結構
 
2、 oradebug使用步驟

 1)啟動sql*plus並以sysdba身份登入
  2)連線到一個程式
  3)設定一個事件或者進行診斷轉儲
  4)檢索trc檔名
  5)與連線到的程式斷開
 
3、 oradebug命令介紹




4、 連線到一個程式

在oradebug命令執行之前,你必須加入一個目標程式。這個目標程式有如下3種情況:

命令

目的

oradebug   setmypid

連線到為你的sql*plus提供服務的程式

oradebug  setorapid   pid

連線到一個外部服務程式,且pid=v$process.pid

oradebug  setospid  spid

連線到一個外部服務程式,且spid=v$process.pid


  1)、 setmypid

    sys@ORCL> oradebug setmypid  
    Statement processed.  
    sys@ORCL> oradebug unlimit  
    Statement processed.  
    sys@ORCL> oradebug event 10046 trace name context forever,level 8   
    Statement processed.  
    sys@ORCL> select * from hr.departments where department_id=10;  
      
    DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID  
    ------------- ------------------------------ ---------- -----------  
               10 Administration                        200        1700  
      
    sys@ORCL> oradebug tracefile_name  
    /u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc  
    sys@ORCL> oradebug event 10046 trace name context off  
    Statement processed. 

   2)、setospid(spid操作)

    sys@ORCL> host top  
      
    top - 15:14:20 up 47 min,  2 users,  load average: 0.22, 0.20, 0.26  
    Tasks: 171 total,   2 running, 168 sleeping,   0 stopped,   1 zombie  
    Cpu(s):  1.3%us,  1.3%sy,  0.0%ni, 97.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st  
    Mem:    678912k total,   671192k used,     7720k free,    16672k buffers  
    Swap:        0k total,        0k used,        0k free,   401584k cached  
      
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                      
     5874 oracle    15   0  2444 1084  828 R  1.6  0.2   0:00.47 top                                          
     4781 root      15   0 53900  11m 6076 S  0.7  1.7   1:00.13 Xorg                                         
     5168 oracle    16   0  491m  17m  15m S  0.3  2.6   0:02.41 oracle                                       
    sys@ORCL> oradebug setospid 5168  
    Oracle pid: 7, Unix process pid: 5168, image: oracle@localhost.localdomain (CKPT) 

  3)、setorapid(pid操作)

    sys@ORCL> select sid from v$mystat where rownum=1;                  
      
           SID  
    ----------  
           159  
      
    sys@ORCL> select pid,spid from v$process p,v$session s where s.sid=159 and s.paddr=p.addr;  
      
           PID SPID  
    ---------- ------------  
            15 5234  
      
    sys@ORCL> oradebug setorapid 15  
    Statement processed.  
    sys@ORCL> oradebug tracefile_name  
    /u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc  
    sys@ORCL> oradebug event 10046 trace name context off  
    Statement processed. 

注意,在OEM的top session也可以等價實現上述效果,即:確定哪些會話消耗了較多的資源

5、 oradebug IPC

檢視共享資訊的記憶體的命令是ipcs [-m|-s|-q]。預設會列出共享記憶體、訊號量,佇列資訊,-m列出共享記憶體,-s列出共享訊號量,-q列出共享佇列

    sys@ORCL> host ipcs -m | grep ora  
    0xbe3bb918 5439503    oracle    640        419438592  20       
    sys@ORCL> oradebug setmypid  
    Statement processed.  
    sys@ORCL> oradebug ipc  
    Information written to trace file.  
    sys@ORCL> oradebug tracefile_name  
    /u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc  
    sys@ORCL> oradebug event 10046 trace name context off  
    Statement processed. 

 當一臺電腦的資源有限時,失敗的例項佔用共享記憶體和訊號量會導致資源緊張,從而使得新的oracle例項無法啟動。
 清除命令是ipcrm [-m|-s|-q] id。
 -m 刪除共享記憶體,-s刪除共享訊號量,-q刪除共享佇列
 如:ipcrm -m 5439503  

6、 oradebug SHORT_STACK

如果一個程式掛起,那麼程式呼叫棧就可以顯示它在呼叫路徑中的哪一步掛起

    sys@ORCL> oradebug setospid 5180  
    Oracle pid: 13, Unix process pid: 5180, image: oracle@localhost.localdomain (D000)  
    sys@ORCL> oradebug short_stack  
                           ksdxfstk()+19<-ksdxcb()+1321<-sspuser()+81<-__kernel_vsyscall()+2<-ntevpque()+112<-ntevque()+606<-nsevwait()+821<-ksnwait()+111<-ksliwat()+770<-kslwaitns()+29<-  
 kskthbwt()+370<-kslwait()+57<-kmdmai()+1797<-kmmrdp()+432<-opirip()+1191<-opidrv()+864<-sou2o()+113<-opimai_real()+353<-main()+111<-__libc_start_main()+220  
    sys@ORCL> oradebug event 10046 trace name context off  
    Statement processed. 

當前的呼叫步驟在輸出的頂部

7、 診斷轉儲

  可轉儲型別如下:

    sys@ORCL> oradebug dumplist  
    EVENTS  
    TRACE_BUFFER_ON  
    TRACE_BUFFER_OFF  
    HANGANALYZE  
    LATCHES  
    PROCESSSTATE  
    SYSTEMSTATE  
    INSTANTIATIONSTATE  
    ......... 


下面舉例兩個:

  1)、controlf

    sys@ORCL> oradebug setmypid  
    Statement processed.  
    sys@ORCL> oradebug dump controlf 10  
    Statement processed.  
    sys@ORCL> oradebug tracefile_name  
    /u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc 

  2)、events

  這不是真正的轉儲,events只是將啟用的事件寫入trc檔案。如果你不能確定一個會話、程式或者例項中哪個事件是活動的,下面有一種很好的方式去查詢:

    sys@ORCL> alter session set events '10046 trace name context forever,level 8';  
      
    Session altered.  
      
    sys@ORCL> alter session set events '4031 trace name heapdump level 3';  
      
    Session altered.  
      
    sys@ORCL> oradebug setmypid  
    Statement processed.  
    sys@ORCL> oradebug dump events 1  
    Statement processed.  
    sys@ORCL> oradebug tracefile_name  
    /u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc  
    sys@ORCL> oradebug event 10046  trace name context off  
    Statement processed. 

oradebug dump events的級別和範圍

級別 事件範圍 使用的命令
1 會話 alter session
2 程式 oradebug  event
4 例項 alter system



8、 小結

     oradebug對於解決問題和診斷效能是必不可少的工具。本文只是講述了一些最常見的命令,還有更多的功能,比如RAC環境下呼叫全域性佇列服務偵錯程式的

oradebug lkdebug命令。


=====補充=====================================================
Oradebug命令它可以啟動用停止跟蹤任何會話,最常用的就是它可以直接透過命令輸出生成trace檔案的名稱(帶路徑的),省去不少麻煩,系統HANG住用它做分析也比較好用!


1> oradebug有哪些可用命令?

  sysdba身份登陸資料庫,透過oradebug help可以看到oradebug常用命令

  sqlplus / as sysdba

  oradebug help

2> 跟蹤當前會話資訊

  oradebug setmypid --跟蹤當前會話

  oradebug setospid --跟蹤系統程式

  oradebug setorapid --跟蹤ORACLE程式

  oradebug unlimit  --取消trace檔案大小限制     

  oradebug tracefile_name --檢視trace檔名及位置

3> oradebugsession1004610053

  oradebug setmypid

  oradebug unlimit

  oradebug session_event 10046 trace name context forever ,level 4   --啟用會話級10046

  oradebug session_event 10046 trace name context off                --關閉10046事件

  oradebug tracefile_name                                            --檢視tracefile檔案位置及檔名

4> oradebugoracle process10046

  oradebug setorapid

  oradebug unlimit

  oradebug event 10046 trace name context forever ,level 4

  oradebug event 10046 trace name context off 

  oradebug tracefile_name

5> oradebug系統hang住原因分析

  如果系統HANG住,只要sys使用者可以登陸,那麼用oradebug做原因分析是非常有用的

  oradebug setmypid

  oradebug unlimit

  oradebug setinst all  --RAC環境

  oradebug hanganalyze 3 -- 級別一般指定為3足夠了

  oradebug -g def dump systemstate 10 --RAC環境

  oradebug tracefile_name

使用oradebug 命令 -- —針對rac的用法
ORADEBUG setmypid
oradebug unlimit
ORADEBUG setinst all
ORADEBUG -g def hanganalyze 3
oradebug close_trace
oradebug tracefile_name
   
對於單例項,我們通常進行如下操作即可:
oradebug setmypid
oradebug unlimit
oradebug hanganalyze 3
oradebug close_trace
oradebug tracefile_name

6> 獲取某程式的狀態資訊

  oradebug setospid 22180

   oradebug dump processstate 10

  oradebug tracefile_name

7> 獲取程式錯誤資訊狀態

  oradebug setospid 22180

  oradebug dump errorstack 3

8> 追蹤造成錯誤資訊的原因,如ORA-04031

  oradebug event 4031 trace name errorstack level 3


   實驗
oradebug session
級別的10046事件跟蹤:

——設定當前會話pid

SYS@ORA11GR2>oradebug setmypid

Statement processed.

 

——開啟10046事件跟蹤:

SYS@ORA11GR2>oradebug session_event 10046 trace name context forever,level 12;

Statement processed.

SYS@ORA11GR2>

——進行操作以生成trace檔案:

SYS@ORA11GR2>create table t1 as select * from user_objects;

 

Table created.

 

SYS@ORA11GR2>select count(*) from t1;

 

  COUNT(*)

----------

     37793

 

——關閉10046事件:

SYS@ORA11GR2>oradebug session_event 10046 trace name context off;

Statement processed.

 

——檢視跟蹤問位置:

SYS@ORA11GR2>oradebug tracefile_name

/u01/app/oracle/diag/rdbms/ora11gr2/ORA11GR2/trace/ORA11GR2_ora_30254.trc

SYS@ORA11GR2>

SYS@ORA11GR2>!ls /u01/app/oracle/diag/rdbms/ora11gr2/ORA11GR2/trace/ORA11GR2_ora_30254.trc

/u01/app/oracle/diag/rdbms/ora11gr2/ORA11GR2/trace/ORA11GR2_ora_30254.trc

驗證:

[oracle@wang trace]$ pwd

/u01/app/oracle/diag/rdbms/ora11gr2/ORA11GR2/trace

[oracle@wang trace]$ ls –lrt

-rw-r----- 1 oracle oinstall      91 Oct 15 23:10 ORA11GR2_mmon_27426.trm

-rw-r----- 1 oracle oinstall    1172 Oct 15 23:10 ORA11GR2_mmon_27426.trc

-rw-r----- 1 oracle oinstall    2344 Oct 15 23:11 ORA11GR2_ora_30254.trm

-rw-r----- 1 oracle oinstall  895526 Oct 15 23:11 ORA11GR2_ora_30254.trc

[oracle@wang trace]$

 

——利用tkprof工具格式化trace檔案:

[oracle@wang trace]$ tkprof ORA11GR2_ora_30254.trc 2311

 

TKPROF: Release 11.2.0.4.0 - Development on Sat Oct 15 23:15:21 2016

 

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 

驗證:

[oracle@wang trace]$ ls 2311.prf

2311.prf

[oracle@wang trace]$

 

——檢視生成的trace檔案:

[oracle@wang trace]$ cat 2311.prf

省略………………………..

*******************************************************************************

SQL ID: f9cw1jf3v3nvk Plan Hash: 1647312333

 

create table t1 as select

 

call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.02       0.01          0          0          0           0

Execute      1      0.21       0.25          0       1371        758       37793

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        2      0.23       0.27          0       1371        758       37793

 

Misses in library cache during parse: 1

Optimizer mode: ALL_ROWS

Parsing user id: SYS

Number of plan statistics captured: 1

 

Rows (1st) Rows (avg) Rows (max)  Row Source Operation

---------- ---------- ----------  ---------------------------------------------------

         0          0          0  LOAD AS SELECT  (cr=1559 pr=0 pw=514 time=255298 us)

     37793      37793      37793   VIEW  USER_OBJECTS (cr=1350 pr=0 pw=0 time=187371 us cost=312 size=538650 card=2835)

     37793      37793      37793    UNION-ALL  (cr=1350 pr=0 pw=0 time=177792 us)

         0          0          0     TABLE ACCESS BY INDEX ROWID SUM$ (cr=0 pr=0 pw=0 time=0 us cost=1 size=9 card=1)

         0          0          0      INDEX UNIQUE SCAN I_SUM$_1 (cr=0 pr=0 pw=0 time=0 us cost=0 size=0 card=1)(object id 1035)

         0          0          0     TABLE ACCESS BY INDEX ROWID OBJ$ (cr=0 pr=0 pw=0 time=0 us cost=3 size=30 card=1)

         0          0          0      INDEX RANGE SCAN I_OBJ1 (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)(object id 36)

     37793      37793      37793     FILTER  (cr=1349 pr=0 pw=0 time=108189 us)

     37793      37793      37793      HASH JOIN  (cr=1078 pr=0 pw=0 time=39878 us cost=295 size=317894 card=2999)

        92         92         92       INDEX FULL SCAN I_USER2 (cr=1 pr=0 pw=0 time=10 us cost=1 size=2024 card=92)(object id 47)

     37793      37793      37793       TABLE ACCESS FULL OBJ$ (cr=1077 pr=0 pw=0 time=22663 us cost=294 size=251916 card=2999)

      1251       1251       1251      TABLE ACCESS BY INDEX ROWID IND$ (cr=271 pr=0 pw=0 time=4705 us cost=2 size=8 card=1)

      1251       1251       1251       INDEX UNIQUE SCAN I_IND1 (cr=52 pr=0 pw=0 time=1233 us cost=1 size=0 card=1)(object id 41)

         0          0          0      NESTED LOOPS  (cr=0 pr=0 pw=0 time=0 us cost=2 size=29 card=1)

         0          0          0       INDEX SKIP SCAN I_USER2 (cr=0 pr=0 pw=0 time=0 us cost=1 size=20 card=1)(object id 47)

         0          0          0       INDEX RANGE SCAN I_OBJ4 (cr=0 pr=0 pw=0 time=0 us cost=1 size=9 card=1)(object id 39)

         0          0          0     TABLE ACCESS BY INDEX ROWID LINK$ (cr=1 pr=0 pw=0 time=19 us cost=0 size=88 card=1)

         0          0          0      INDEX RANGE SCAN I_LINK1 (cr=1 pr=0 pw=0 time=18 us cost=0 size=0 card=1)(object id 138)

 

 

Elapsed times include waiting on following events:

  Event waited on                             Times   Max. Wait  Total Waited

  ----------------------------------------   Waited  ----------  ------------

  Disk file operations I/O                        2        0.00          0.00

  direct path write                              18        0.00          0.00

  direct path sync                                1        0.04          0.04

  log file sync                                   1        0.00          0.00

  SQL*Net message to client                       1        0.00          0.00

  SQL*Net message from client                     1        0.00          0.00

**************************************************************************************************************************************************************

SQL ID: 5bc0v4my7dvr5 Plan Hash: 3724264953

 

select count(*)

from

 t1

 

call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          1          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        2      0.00       0.00        120        518          0           1

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        4      0.00       0.00        120        519          0           1

 

Misses in library cache during parse: 1

Optimizer mode: ALL_ROWS

Parsing user id: SYS

Number of plan statistics captured: 1

 

Rows (1st) Rows (avg) Rows (max)  Row Source Operation

---------- ---------- ----------  ---------------------------------------------------

         1          1          1  SORT AGGREGATE (cr=518 pr=120 pw=0 time=4122 us)

     37793      37793      37793   TABLE ACCESS FULL T1 (cr=518 pr=120 pw=0 time=7913 us cost=141 size=0 card=37628)

 

 

Elapsed times include waiting on following events:

  Event waited on                             Times   Max. Wait  Total Waited

  ----------------------------------------   Waited  ----------  ------------

  SQL*Net message to client                       2        0.00          0.00

  db file scattered read                         20        0.00          0.00

  db file sequential read                         1        0.00          0.00

  SQL*Net message from client                     2        0.00          0.00

 

***********************************************************************

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2141713/,如需轉載,請註明出處,否則將追究法律責任。

相關文章