【Oracle】資料庫hang 診斷

parknkjun發表於2015-03-30
一 什麼是資料庫hang 
1 使用者不能登入資料庫
2 資料庫不能正常工作
3 select 1 from dual 不出結果
4 不能正常完成建表操作

二 資料庫被鎖住
   1  一個或多個會話停止工作
三 如果得知資料庫hang 或者被鎖
   1 測試
   2 使用者抱怨
   3 systemstate 或者hanganalze 操作檢視被阻塞的會話
   4 一個查詢hang 住不動
   5 會話耗費了大量的cpu
   6 ora-60 錯誤出現
四  上述現象可能會在以下操作之後:
   1 schema 變動
   2 資料庫引數變動
   3 應用程式的改動
   4 資料庫升級
五  理清 issue 發生的狀況,你必須瞭解如下
   1 受影響的使用者
   2 導致問題的事件的發生的順序
   3 問題是從哪裡/如何被發現的
   4 問題的表現
   5 什麼正在工作
   6 最希望的或者最能夠接受的結果是什麼
   7 你做了什麼操作來解決這個問題
六 驗證工作 
   必須對資料庫是否hang 或者lock 進行驗證 否則會導致採取錯誤的動作。也有可能是os 的效能問題導致資料庫表現為hang 住的!!
   select 1 from dual;

七 收集資料
  1 使用 LTOM 收集資料
  2 使用 OSW 收集系統效能資料
  3 使用 EM 

八 使用hanganalyze 和systemstate 收集資料
  DUMP程式狀態可以使用: 
    alter sessions set events 'immediate trace name processstate level ';
  或者使用:
    oradebug setmypid
    oradebug ulimit
    oradebug dump processstate
當診斷資料庫掛起時,可以使用DUMP命令轉儲整個系統狀態:
alter sessions set events 'immediate trace name systemstate level ';
或:
oradebug setmypid
oradebug ulimit
oradebug dump systemstate
如果為了獲取全面一點的資訊,可以使用Level 10。
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug dump systemstate 10
另外如果系統掛起,無法用SQL*Plus連線,從Oracle 10g開始,可以使用sqlplus -prelim選項強制登入,然後即可進行系統狀態資訊轉儲:
sqlplus -prelim '/ as sysdba'
oradebug setmypid
oradebug unlimit;
oradebug dump systemstate 10
====================================
--for 單例項
SQL>ORADEBUG hanganalyze
--for RAC 例項
SQL>ORADEBUG setmypid
SQL>ORADEBUG setinst all
SQL>ORADEBUG -g def hanganalyze  
注意:如果Level過大的話會產生大量的跟蹤檔案並影響系統的I/O效能,Oracle建議不要採用3級以上的跟蹤。
以sysdba 登入
oradebug setmypid
oradebug unlimit
oradebug -g  all hanganalyze 3
oradebug -g all dump systemstate 266
--等待2min
oradebug -g  all hanganalyze 3
oradebug -g all dump systemstate 266

預設蒐集資料的步驟如下:
1 hanhanalyze  level 3
2 systemstate level 266
3 wait 60 sec
4 hanhanalyze  level 3
5 systemstate level 266

對於單例項 trace file 檔案在 本地的user_dump_desttination 
對於rac 環境 trace file 檔案在每個節點的 backgroup_dump_destination

九 獲取v$效能資料
SPOOL v_views.log;

/*set linesize 130
col "Parameter" form. a50
col "Session Value" form. a30
col "Instance Value" form. a30
*/
select a.ksppinm  "Parameter",
       b.ksppstvl "Session Value",
       c.ksppstvl "Instance Value"
  from x$ksppi a, x$ksppcv b, x$ksppsv c
  where a.indx = b.indx
   and a.indx = c.indx
  order by 1 ;

SELECT class valuename FROM v$sysstat;

SELECT sid , id1, id2, type, lmode, request FROM v$lock;

SELECT l.latch#,
       n.name,
       h.pid,
       l.gets,
       l.misses,
       l.immediate_gets,
       l.immediate_misses,
       l.sleeps
  FROM v$latchname n, v$latchholder h, v$latch l
  WHERE l.latch# = n.latch#
   AND l.addr = h.laddr(+);

SELECT * FROM v$session_wait ORDER BY sid ;
/* repeat last query 3 times - we want to see who's repeatedly waiting*/
SPOOL OFF;

獲取了資料之後 就是分析了!!

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

相關文章