Oracle實例佔用超高CPU排查

CPU主要功能:處理指令、執行操做、要求進行動做、控制時間、處理數據。sql

結合數據庫實例CPU佔用高,可能的緣由是數據庫在執行大量的操做(全表查詢、大量排序等)。數據庫

因爲公司沒有DBA,遇到數據庫問題只能本身排查。session

1、是否存在死鎖

查詢死鎖以及解鎖的語句參考下方:
  • 查看死鎖ID
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.Oracle_USERNAME,l.OS_USER_NAME,l.PROCESS FROM V$LOCKED_OBJECT
l,V$SESSION S WHERE l.SESSION_ID=S.SID;
  • 查看錶名稱
select b.owner,b.object_name,a.session_id,a.locked_mode  from v$locked_object a,dba_objects b  where b.object_id = a.object_id; 
  • 手工關閉死鎖
alter system kill session ‘sid,serial#’; (其中sid=l.session_id) 
經過查詢死鎖也發現了一些死鎖,殺掉後CPU沒有降下來,只能從新排查。

2、藉助PLSQL查詢定時job和session

經過PL/SQL查詢到,不存在定時的JOB執行。
經過Tools-Sessions,發現存在較多數據庫鏈接與訪問,但較難定位到具體那個sql或表存在問題。
因而,Kill了全部Session,CPU獲得緩解,但根本緣由未查到,隔幾分鐘又反覆了。

3、查詢數據庫中的等待事件

SELECT P.PID,
S.SID,
S.SERIAL#,
S.USERNAME,
Q.SQL_ID,
Q.SQL_TEXT,
Q.SQL_FULLTEXT,
W.EVENT,
W.WAIT_TIME,
W.STATE,
CASE
WHEN W.STATE = 'WAITING' THEN
W.SECONDS_IN_WAIT
WHEN W.STATE = 'WAITING KNOWN TIME' THEN
W.WAIT_TIME
END AS SEC_IN_WAIT
FROM V$SESSION S, V$SESSION_WAIT W, V$SQLAREA Q, V$PROCESS P
WHERE S.SID = W.SID
AND S.SQL_ID = Q.SQL_ID
AND P.ADDR = S.PADDR
AND W.EVENT NOT LIKE 'SQL*Net%'
AND S.USERNAME IS NOT NULL
AND W.WAIT_TIME >= 0
ORDER BY W.WAIT_TIME DESC;優化

發現存在等待事件,分析待執行的SQL發現存在多表(百萬數據)全量關聯查詢。spa

因而對數據以及SQL進行了相應優化,CPU佔用較高問題獲得根本解決。排序

4、過程總結

形成CPU暴增的緣由有不少,思路也有不少,後續若是遇到能夠參考上述思路,精準定位到問題並進行優化。事件

相關文章
相關標籤/搜索