[轉]定位占用oracle數據庫cpu過高的sql


 

    今天在吃飯的時候我的朋友的數據庫出現了問題,cpu占用率為97%,當我看到這個問題的時候我就想到了或許是sql導致的此問題,由於忍不住吃飯,暫時沒有幫他看這個問題,這是我飯后自己模擬的故障,進行的分析:

 1)查看一下cpu進程占用情況:

 

 

看到oracle進程為6331,6517等這幾個進程占用cpu過高。

 

2)查看相關進程信息:

[oracle@oracle-one ~]$ ps -ef | grep 6331  
oracle    6331     1 23 20:24 ?        00:02:05 ora_vktm_RHYS  
oracle    6555  6385  0 20:32 pts/2    00:00:00 grep 6331  
[oracle@oracle-one ~]$ ps -ef | grep 6517  
<span style="color:#ff0000">oracle    6517  6513  9 20:28 ?        00:00:24 oracleRHYS (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))  
</span>oracle    6557  6385  0 20:33 pts/2    00:00:00 grep 6517  
[oracle@oracle-one ~]$   

 

 

3)查看該會話信息: 

SQL> select sid,serial#,username,machine,osuser,process from v$session s  
  2     where s.paddr=(select addr from v$process p where p.spid='&pid');  
Enter value for pid: 6517  
old   2:    where s.paddr=(select addr from v$process p where p.spid='&pid')  
new   2:    where s.paddr=(select addr from v$process p where p.spid='6517')  
  
       SID    SERIAL# USERNAME     MACHINE         OSUSER                         PROCESS  
---------- ---------- ----------- ---------------- ------------------------------ ------------------------  
         1         21 RHYS         oracle-one      oracle                         6513  

可知:session 的信息為sid:1  serial#:21 數據庫用戶為:RHYS,客戶端機器為:oracle-one,操作系統用戶為:oracle 進程號:6513 

 

4)查看該會話正在運行的sql: 

SQL> select sql_text from v$sqltext  
  2   where (address,hash_value) in (  
  select sql_address,sql_hash_value from v$session s   
  3    4        where s.paddr=  
  5       (select addr from v$process p where p.spid='&pid'));  
Enter value for pid: 6517  
old   5:      (select addr from v$process p where p.spid='&pid'))  
new   5:      (select addr from v$process p where p.spid='6517'))  
  
<span style="color:#ff0000">SQL_TEXT  
----------------------------------------------------------------  
delete from amy_emp</span>  

     可知,當前用戶正在進行刪除表的操作,本次就是通過v$process 的spid找到進程號,然后找到v$session 的addr地址,然后找到v$sqltext的sql_address以及sql_hash_value,

     通過這兩個字段就可以定位出唯一的sql_text,本次通過v$process,v$session,v$sql_text三個視圖結合找到相應的sql;

 

5)后續處理

      如果該session為非法的,可以使用如下命令殺掉該會話:   alter  sytem kill  session '1,21';  

      既然找到sql了,那么 我們就可以通知應用相關人員,確認是否在進行相關數據操作。

     另外我們也可以使用dbms_system包對該session進行更加詳細的跟蹤。

 

 

比價老的一篇文章,轉自:http://www.bitscn.com/pdb/oracle/201309/241814.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM