oradebug的簡單介紹及應用

FROM:http://duqiangatom.blog.163.com/blog/static/11502518201061392857916/

自ORACLE7起,ORADEBUG工具就開始被DBA使用了。它可以tracing any session / dump SGA and other memory str ture / wakeup oracle process / suspend and resume processing ….


一、 概要
首先看看help
SQL> oradebug help

首先確認要追蹤哪個進程?可以查詢spid或是oracle自己的pid
SQL> select a.username,a.sid ,a.serial#,b.spid
from v$session a,v$process b
where a.paddr=b.addr
/
------查詢spid
以本次實驗爲例
USERNAME SID SERIAL# SPID
------------------------------ ---------- ---------- ------------
SCOTT 155 1524 2204

SQL> select pid,spid,username from v$process;
PID SPID USERNAME
---------- ------------ ---------------
23 2204 Administrator

設定追蹤
SQL> oradebug setospid 2204
Oracle pid: 15, Windows thread id: 2204, image: ORACLE.EXE (SHAD)
或設定 SQL> oradebug setorapid 23

SQL> oradebug unlimit
已處理的語句
本次有個疑問: 爲什麼顯示是ORACLE.EXE?windows進程與線程的問題?

oracle 3180 8 24 482 223056 0:00:50.212 2:15:12.204
2204 9 89 Wait:UserReq 0:00:00.020 0:00:00.010 0:08:37.113

sid設定之後,可以用來dump的東西可用oradebug dumplist 列出。在這些項中絕大部分,都有2,4,6,8,10,12等幾個跟蹤級別。

A. 獲得系統狀態
用於獲得系統狀態
SQL> oradebug dump systemstate 10
已處理的語句
(注:有趣的事件發生了,系統生成trc用打開,然後將文件內容刪除,此時的設定生成了一個bak文件。仔細觀察,發現oradebug指向的trc出口也發生了變化,指向了bak文件)

如果系統hung的時候,systemstate基本等同於hanganalyze,可以用於診斷system hung
SQL> oradebug hanganalyze 12
Hang Analysis in d:\oracle\prod t\10.2.0\admin\orcl\ ump\orcl_ora_3576.trc
(注:trc文件怎麼看還不會…)


B. 獲得某個進程狀態
SQL> oradebug setospid 3188
Oracle pid: 12, Windows thread id: 3188, image: ORACLE.EXE (MMNL)
SQL> oradebug setospid 1192
ORA-01858: 在要求輸入數字處找到非數字字符
(注:測試發現該進程必須是ORACLE進程/線程)
SQL> oradebug dump processstate 10
已處理的語句

C. 也可以獲得進程的錯誤信息狀態
SQL> oradebug dump errorstack 3
已處理的語句
(注:本處沒有產生新的trace,難道是需要出錯的時候纔有信息?)

D. 定位現在在使用哪個trace
SQL> oradebug TRACEFILE_NAME
d:\oracle\prod t\10.2.0\admin\orcl\ ump\orcl_ora_3648.trc


二、 高級一點的應用
1.Trace a session SQL
1) 如果是隻想抓取用戶sql語句的話(level 1),使用DBMS_SYSTEM包
select a.username,a.sid ,a.serial#,b.spid
from v$session a,v$process b
where a.paddr=b.addr
/
USERNAME SID SERIAL# SPID
------------------------------ ---------- ---------- -------------------- ---------- ---------- -------
SCOTT 143 6 3260

執行SQL> execute dbms_system.set_sql_trace_in_session(143,6,tr); 開啓對該進程的trace,記錄在trace文件中。
執行SQL> execute dbms_system.set_sql_trace_in_session(143,6,false); 關閉追蹤

2) 如果想進行更高級別的抓取,level 4,要使用oradebug
首先按照前面得到進程的spid
SQL> oradebug setospid 3260
Oracle pid: 22, Windows thread id: 3260, image: oracle.exe (SHAD)
SQL> oradebug event 10046 trace name context forever,level 4
已處理的語句
(注:可以同時追蹤多個進程,setospid …. , Oradebug …10046…)

抓取後取消追蹤使用
SQL> oradebug event 10046 trace name context off
已處理的語句


2. Tracing errors use oradebug
例如要追蹤能造成ORA-0094/952錯誤的會話,則
SQL> oradebug event 942 trace name errorstack level 3
已處理的語句
SQL> oradebug event 952 trace name errorstack level 3
已處理的語句

3. Trace ORA-04030
ORA-04030是由於某些進程請求的內存不斷增大最後導致溢出的錯誤
SQL > oradebug setodpid <pid>
SQL > oradebug unlimit
SQL > oradebug dump heapdump 5 ?this dump PGA and UGA heaps


4. waking up PMON to release DDL locks
首先確認PMON進程是who
SQL> select pid,spid from v$process p,v$bgprocess b
where b.paddr=p.addr
and name='PMON';

PID SPID
---------- ------------
2 3608
SQL> oradebug wakeup 2
已處理的語句

5. 暫停和啓動進程(suspending and resuming a process)
SQL> oradebug setospid ***
SQL> oradebug suspend
Or
SQL> oradebug setospid ***
SQL> oradebug resume

6. DUMP很多東西
oradebug可以dump很多內容,例如latch / library_cache / locks / controlfile 等等
具體可參照 oradebug dumplist 的信息

例子:
oradebug dump controlf 10
oradebug dump file_hdrs 10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章