Oradebug使用淺談--生成Hang或Locking問題分析檔案

hd_system發表於2017-05-02

一、             簡介

oradebug是一個未被文件記錄的Oracle命令,可以用來檢測例項和會話中出現的故障,

擁有管理員的許可權才可以執行此命令。使用oradebug你可以完成如下工作(並不侷限於此):

l  啟用/禁用其他使用者會話的SQL tracing

l  掛起問題程式

l  在共享記憶體和訊號量中查詢資訊

l  關閉trace檔案以便生成新的trace檔案

l  操作、轉儲內部結構

l  喚醒程式

二、             Oradebug使用例項

下面透過兩個實用的例子展示oradebug命令的使用。

1、  使用Oradebug獲得trace檔案的名稱和位置

 

[oracle@sunny ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Oct 16 17:35:12 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

 

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

 

SQL> alter session set events '10046 trace name context forever, level 12';

 

Session altered.

 

SQL> oradebug setmypid

Statement processed.

SQL> oradebug tracefile_name

/u01/app/oracle/admin/STUDY/udump/study_ora_5179.trc

 

2、  使用Oradebug呼叫另一個會話的跟蹤(10046

 

[oracle@sunny ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Oct 16 17:40:40 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

 

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

 

SQL> select spid

  2  from v$process

  3  where addr = (select paddr from v$session where username = 'SUNNY');

SPID

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

5366

SQL> oradebug setospid 5366

Oracle pid: 18, Unix process pid: 5366, image: oracle@sunny.syp.com (TNS V1-V3)

SQL> oradebug event 10046 trace name context forever,level 12

Statement processed.

SQL> oradebug tracefile_name

/u01/app/oracle/admin/STUDY/udump/study_ora_5366.trc

SQL> oradebug event 10046 trace name context off

Statement processed.

 

三、             生成Hang/Locking問題的分析檔案

Hang/Locking問題相比於系統緩慢來說是更為棘手的問題,所以及時、合理的處理是非

常必要的。當類似問題發生時應首先判斷是否確實遇到了Hang/Locking問題,資料庫Hang住可以表現為:

l  資料庫不再允許使用者連線

l  資料庫不再工作

l  Select 1 from dual沒有輸出

l  Create table不能完成

相應的,Locking問題可以表現為:

l  一個或者多個會話完全停止工作

如果確認遇到了Hang/Locking問題,那麼下一步就是收集相應的資訊,已確定問題產生的原因並尋找對應的解決方法。hanganalyzesystenstate對於分析此類問題有很大的幫助,建議的生成方式如下:

 

1、  export ORACLE_SID=生產環境ORACLE_SID

 

2、  使用SQL*Plussysdba身份登入:

sqlplus -prelim / as sysdba

重複三次,建立三個會話(SQL1, SQL2, and SQL3)
 

3、  SQL1執行如下命令 :

SQL1> oradebug setmypid
SQL1> oradebug unlimit
SQL1> oradebug hanganalyze 3

 

4、  SQL2 執行如下命令:

SQL2> oradebug setmypid
SQL2> oradebug unlimit
SQL2> oradebug dump systemstate 266

 

5、  等待至少兩分鐘.
 

6、  SQL1 執行如下命令:

SQL1> oradebug hanganalyze 3

 

7、  SQL3 執行如下命令:

SQL3> oradebug setmypid
SQL3> oradebug unlimit
SQL3> oradebug dump systemstate 266

 

三份新的trace檔案會在user_dump_destination下生成,其中一份包含兩次hanganalyzedump,另外兩份各包含一次systemstate dump

 

對於叢集環境,可以採用如下步驟:

 

1、  export ORACLE_SID=生產環境ORACLE_SID
 

2、  透過SQL*Plussysdba身份連線資料庫:

sqlplus -prelim / as sysdba

 

3、  執行如下命令:

SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug -g all hanganalyze 3
SQL> oradebug -g all dump systemstate 266

 

4、  等待至少兩分鐘
 

5、  執行如下命令:

SQL> oradebug -g all hanganalyze 3
SQL> oradebug -g all dump systemstate 266

 

trace檔案會被寫入到diag後臺程式的trace檔案中,在每個節點的background_dump_destination目錄中。

 

參考文件:

How to Use Oradebug to Get Trace File Name and Location [ID 310830.1]

How to Enable SQL_TRACE for Another Session or in MTS Using Oradebug

[ID 1058210.6]

ORADEBUG - UNDOCUMENTED ORACLE UTILITY  By Miladin Modrakovic

Oracle Performance Diagnostic Guide Hang/Locking

10046 Trace啟動方法

開啟當前會話的10046 Trace

使用sql_trace引數

sql_trace應該是簡單快捷的開啟Trace的方法了,不過透過sql_trace只能開啟級別為1Trace,而無法開啟其他更高階的Trace

1

2

3

4

5

-- 開啟Trace

ALTER SESSION SET sql_trace=true;

 

-- 關閉Trace

ALTER SESSION SET sql_trace=false;

使用set event開啟Trace

使用set event開啟10046事件Trace是最常用的了。

1

2

3

4

5

-- 開啟級別為12Tracelevel後面的數字設定了Trace的級別

ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'

 

-- 關閉Trace,任何級別

ALTER SESSION SET EVENTS '10046 trace name context off'

開啟其他會話的10046 Trace

使用登陸觸發器開啟Trace

我們可以透過編寫登陸觸發器來開啟10046 Trace,使用這種方法開啟Trace的程式碼和開啟當前會話的是一樣的,不同的就是這些開啟程式碼是包含在一個after logon觸發器裡面的。

1

2

3

4

5

6

7

8

9

10

-- 程式碼來自《Optimazing Oracle Performance P116

CREATE OR REPLACE TRIGGER trace_test_user AFTER LOGON ON DATABASE

BEGIN

  IF USER LIKE '%\_test' ESCAPE '\' THEN

    EXECUTE IMMEDIATE 'ALTER SESSION SET timed_statistics=true';

    EXECUTE IMMEDIATE 'ALTER SESSION SET max_dump_file_size=unlimited';

    EXECUTE IMMEDIATE 'ALTER SESSION SET EVENTS ''10046 trace name context forever, level 8'' ';

  END IF;

END;

/

使用oradebug工具

使用oradebug工具必須要知道所要處理的程式的OS程式PIDOS PID可以使用下面的語句得到:

1

2

3

4

5

6

SELECT S.USERNAME,

    P.SPID OS_PROCESS_ID,

    P.PID ORACLE_PROCESS_ID

FROM V$SESSION S, V$PROCESS P

WHERE S.PADDR = P.ADDR

    AND S.USERNAME = UPPER('&USER_NAME');

得到PID之後就可以使用oradebug工具了,注意需要使用sysdba登陸

1

2

3

4

5

6

7

8

-- 假設9999為會話的OS PID

oradebug setospid 9999;

-- 設定Trace檔案大小

oradebug unlimit;

-- 開啟級別為12Trace

oradebug event 10046 trace name context forever ,level 12;

--關閉trace

Oradebug event 10046 trace name context off;

 

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

相關文章