1.下載Process Explorer
2.打開Process Explorer,查看CPU使用情況最高的進程
3.雙擊該進程,查看詳情
\
4. 獲取cpu使用最好的線程tid
5. 查詢sql_id
select sql_id from v$session where paddr in( select addr from v$process where spid in('16796','11972','9812','11652','5484') )
6.根據5中的sql_id查詢具體執行占用CPU過高的sql語句
select * from v$sqlarea where sql_id in(sql_id1,sql_id2,sql_id3...);
7.查詢sid和serial#
SELECT sid,serial#,sql_id from v$session where sql_id in(sql_id1,sql_id2,sql_id3...)
8.殺掉進程
alter system kill session 'sid,serial#';
或批量殺進程
SELECT 'alter system kill session '''||sid||','||serial#||''';' from v$session where sql_id in(sql_id);
9.分析SQL進行優化
一、問題描述
運行在Windows上的Oracle開發庫的oracle進程CPU使用率保持在99%,服務器和數據庫均反應緩慢。
二、排查思路
可能造成CPU使用率高的情況有:大量排序、大量SQL解析、全表掃描、Oracle Bug等。因此希望找到占用CPU較高的進程ID(UNIX或LINUX)或線程ID(Windows)來找到對應的SQL語句,以分析問題的原因。
三、處理步驟
1. 下載process explorer工具,用於查看Windows環境下的進程和線程信息。
2. 雙擊oracle.exe進程,查看oracle的線程信息,按照CPU使用率倒序排序,找到占用CPU較高的TID。(如在UNIX或LINUX系統中,使用top命令即可獲得占用CPU較高的進程ID,使用進程ID去數據庫中查找對應信息即可)
3. 使用上面找到的TID代入下面的SQL查詢對應的SQL語句或會話信息。
SELECT sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),DECODE(sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.paddr =(SELECT addr FROM v$process c WHERE c.spid = '&pid')) ORDER BY piece ASC;
select id,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy-mm-dd hh24:mi:ss') logon from v$session where paddr in ( select addr from v$process where spid in('&pid'));
4. kill掉查出的會話,記錄查出的SQL語句待后續分析。
四、總結:
在進行第三步的時候遇到狀況:使用找出的TID在數據庫中查不到對應的SQL和會話信息。為先恢復數據庫服務,直接kill了占用CPU較高的幾個線程,后續通過分析AWR和ASH報告推測本次故障與數據庫中幾個涉及臨時表創建和操作的存儲過程有關,在存儲過程執行中有大量的全表掃描和直接路徑讀並伴隨大量的物理讀操作。