Oracle進程占用CPU100%的問題分析及解決方法
問題現(xiàn)象
Linux環(huán)境,數據庫CPU一直處于100%。業(yè)務系統(tǒng)運行很慢。Top命令結果如下:
問題分析
方法1
根據上圖中的oracle進程在操作系統(tǒng)對應的 PID號 : 如 6999,8100 等
通過下面的SQL,查詢
select s.SQL_HASH_VALUE, s.SQL_ADDRESS from v$session s, v$process p where s.PADDR = p.ADDR and p.SPID = '6999' ---換成相關的pid值
然后,將 查詢出的 SQL_HASH_VALUE ,SQL_ADDRESS 對應代入下面的sql,或者只用其中一個也可以。
select * from v$sqltext t where (t.HASH_VALUE = ' s.SQL_HASH_VALUE ' or --自行替換上述查的值 t.ADDRESS = ' s.SQL_ADDRESS ') --自行替換上述查的值 order by piece
方法2
通過如下SQL查詢在數據庫中執(zhí)行緩慢的sql
SELECT /*+rule*/ S.SQL_ID, S.SID, s.BLOCKING_SESSION, S.SERIAL#, S.USERNAME, W.EVENT, W.SECONDS_IN_WAIT, W.WAIT_TIME, S.LAST_CALL_ET, S.STATUS, S.CLIENT_INFO, Q.SQL_TEXT, Q.HASH_VALUE, Q.ADDRESS, 'alter system kill session ''' || S.SID || ',' || S.SERIAL# || ''' immediate;' FROM V$SESSION_WAIT W, V$SESSION S, V$SQL Q WHERE W.SID = S.SID AND Q.HASH_VALUE = S.SQL_HASH_VALUE AND W.EVENT NOT LIKE '%message from client%' AND S.SID >= 6 ORDER BY LAST_CALL_ET DESC;
發(fā)現(xiàn)耗時sql如下
--- SQL-1 --- 這個 SQL 語句用于獲取特定用戶活動會話相關的執(zhí)行計劃,并以一種特定的格式展示這些信息 select * from (select hash_value || '***' || rpad('|' || substr(lpad(' ', 1 * (depth - 1)) || operation || decode(options, null, '', ' ' || options), 1, 32), 33, ' ') || '|' || rpad(decode(id, 0, '----- ' || to_char(hash_value) || ' -----', substr(decode(substr(object_name, 1, 7), 'SYS_LE_', null, object_name) || ' ', 1, 20)), 21, ' ') || '|' || lpad(decode(cardinality, null, ' ', decode(sign(cardinality - 1000), -1, cardinality || ' ', decode(sign(cardinality - 1000000), -1, trunc(cardinality / 1000) || 'K', decode(sign(cardinality - 1000000000), -1, trunc(cardinality / 1000000) || 'M', trunc(cardinality / 1000000000) || 'G')))), 7, ' ') || '|' || lpad(decode(bytes, null, ' ', decode(sign(bytes - 1024), -1, bytes || ' ', decode(sign(bytes - 1048576), -1, trunc(bytes / 1024) || 'K', decode(sign(bytes - 1073741824), -1, trunc(bytes / 1048576) || 'M', trunc(bytes / 1073741824) || 'G')))), 6, ' ') || '|' || lpad(decode(cost, null, ' ', decode(sign(cost - 10000000), -1, cost || ' ', decode(sign(cost - 1000000000), -1, trunc(cost / 1000000) || 'M', trunc(cost / 1000000000) || 'G'))), 8, ' ') || '|' as "Explain plan" from v$sql_plan where hash_value in (select s.sql_hash_value from v$session s where s.username = upper('[user]') and s.status = 'ACTIVE' and s.last_call_et > 10)) --- SQL-2 --- 監(jiān)控和分析數據庫中活動會話的執(zhí)行情況 select s.client_identifier, s.sid, s.serial#, sql.sql_fulltext, s.last_call_et, s.event, sql.SQL_ID, child_number, s.sql_hash_value from v$session s, v$sql sql where s.sql_address = sql.ADDRESS and s.username = upper('[user]') and s.status = 'ACTIVE' and s.last_call_et > 10 order by sid
方法3
使用AWR查看耗時SQL
Oracle>sqlplus “/as sysdba” SQL>@?/rdbms/admin/awrrpt.sql
查詢SQL ordered by Elapsed Time
查詢SQL ordered by CPU Time
相關SQL
根據awr的報告 ,也可以看出, 耗費CPU的 SQL 時 在awr中 ,可以 通過 SQL ID找到當時執(zhí)行時對應的執(zhí)行計劃:
select * from table(dbms_xplan.display_awr('6h6zz42n9rmnw'));
解決方案
1、經過溝通,發(fā)現(xiàn)相關的SQL是由于NMC調用了Oracle監(jiān)控腳本導致的。
nmc\server\conf\monitor.properties 文件中配置的監(jiān)控腳本 。注釋掉即可 。
2、停止NMC,殺掉相關數據庫會話。
以上就是Oracle進程占用CPU100%的問題分析及解決方法的詳細內容,更多關于Oracle進程占用CPU100%的資料請關注腳本之家其它相關文章!
相關文章
隨機獲取oracle數據庫中的任意一行數據(rownum)示例介紹
對于rownum來說它是oracle系統(tǒng)順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,這個偽字段可以用于限制查詢返回的總行數,且rownum不能以任何表的名稱作為前綴2014-07-07