1. 程式人生 > 實用技巧 >Oracle資料庫CPU使用率過高處理記錄

Oracle資料庫CPU使用率過高處理記錄

一、問題描述

執行在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報告推測本次故障與資料庫中幾個涉及臨時表建立和操作的儲存過程有關,在儲存過程執行中有大量的全表掃描和直接路徑讀並伴隨大量的物理讀操作。