Oracle進(jìn)程占用CPU100%的問(wèn)題分析及解決方法
問(wèn)題現(xiàn)象
Linux環(huán)境,數(shù)據(jù)庫(kù)CPU一直處于100%。業(yè)務(wù)系統(tǒng)運(yùn)行很慢。Top命令結(jié)果如下:


問(wèn)題分析
方法1
根據(jù)上圖中的oracle進(jìn)程在操作系統(tǒng)對(duì)應(yīng)的 PID號(hào) : 如 6999,8100 等
通過(guò)下面的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' ---換成相關(guān)的pid值

然后,將 查詢出的 SQL_HASH_VALUE ,SQL_ADDRESS 對(duì)應(yīng)代入下面的sql,或者只用其中一個(gè)也可以。
select *
from v$sqltext t
where (t.HASH_VALUE = ' s.SQL_HASH_VALUE ' or --自行替換上述查的值
t.ADDRESS = ' s.SQL_ADDRESS ') --自行替換上述查的值
order by piece
方法2
通過(guò)如下SQL查詢?cè)跀?shù)據(jù)庫(kù)中執(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)耗時(shí)sql如下
--- SQL-1
--- 這個(gè) SQL 語(yǔ)句用于獲取特定用戶活動(dòng)會(huì)話相關(guān)的執(zhí)行計(jì)劃,并以一種特定的格式展示這些信息
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)控和分析數(shù)據(jù)庫(kù)中活動(dòng)會(huì)話的執(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查看耗時(shí)SQL
Oracle>sqlplus “/as sysdba” SQL>@?/rdbms/admin/awrrpt.sql
查詢SQL ordered by Elapsed Time

查詢SQL ordered by CPU Time

相關(guān)SQL

根據(jù)awr的報(bào)告 ,也可以看出, 耗費(fèi)CPU的 SQL 時(shí) 在awr中 ,可以 通過(guò) SQL ID找到當(dāng)時(shí)執(zhí)行時(shí)對(duì)應(yīng)的執(zhí)行計(jì)劃:
select * from table(dbms_xplan.display_awr('6h6zz42n9rmnw'));解決方案
1、經(jīng)過(guò)溝通,發(fā)現(xiàn)相關(guān)的SQL是由于NMC調(diào)用了Oracle監(jiān)控腳本導(dǎo)致的。
nmc\server\conf\monitor.properties 文件中配置的監(jiān)控腳本 。注釋掉即可 。
2、停止NMC,殺掉相關(guān)數(shù)據(jù)庫(kù)會(huì)話。

以上就是Oracle進(jìn)程占用CPU100%的問(wèn)題分析及解決方法的詳細(xì)內(nèi)容,更多關(guān)于Oracle進(jìn)程占用CPU100%的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
常見(jiàn)數(shù)據(jù)庫(kù)系統(tǒng)比較 Oracle數(shù)據(jù)庫(kù)
常見(jiàn)數(shù)據(jù)庫(kù)系統(tǒng)比較 Oracle數(shù)據(jù)庫(kù)...2007-03-03
Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)遷移完整解決步驟
我們常常需要對(duì)數(shù)據(jù)進(jìn)行遷移,遷移到更性能配置更高級(jí)的主機(jī)OS上、遷移到遠(yuǎn)程的機(jī)房、遷移到不同的平臺(tái)下,這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)遷移的相關(guān)資料,需要的朋友可以參考下2024-02-02
Oracle數(shù)據(jù)庫(kù)密碼文件的使用與維護(hù)
Oracle數(shù)據(jù)庫(kù)密碼文件的使用與維護(hù)...2007-03-03
隨機(jī)獲取oracle數(shù)據(jù)庫(kù)中的任意一行數(shù)據(jù)(rownum)示例介紹
對(duì)于rownum來(lái)說(shuō)它是oracle系統(tǒng)順序分配為從查詢返回的行的編號(hào),返回的第一行分配的是1,第二行是2,依此類推,這個(gè)偽字段可以用于限制查詢返回的總行數(shù),且rownum不能以任何表的名稱作為前綴2014-07-07
Oracle數(shù)據(jù)庫(kù)中保留小數(shù)點(diǎn)后兩位的問(wèn)題解讀
在Oracle數(shù)據(jù)庫(kù)中,對(duì)數(shù)字和百分比進(jìn)行格式化,以保留兩位小數(shù),主要使用to_char()函數(shù),對(duì)于大數(shù)字如10000000.12,使用to_char(字段名, 'FM99999999999990.00')可確保保留兩位小數(shù)而無(wú)額外空格,對(duì)于百分比如86.63%2024-09-09
Oracle數(shù)學(xué)相關(guān)函數(shù)小結(jié)
這篇文章主要介紹了Oracle數(shù)學(xué)相關(guān)函數(shù),實(shí)例總結(jié)了Oracle常用的數(shù)學(xué)相關(guān)函數(shù)并給出了相應(yīng)用法示例,需要的朋友可以參考下2016-03-03
Oracle9i 動(dòng)態(tài)SGA,PGA特性探索
雖然Oracle9i中的內(nèi)存管理仍然需要很多的手工操作,不過(guò)大部分的Oracle管理員可以使用工具來(lái)連續(xù)地監(jiān)控Oracle SGA中的內(nèi)存使用,并且可以根據(jù)Oracle instance中現(xiàn)在的使用情況來(lái)自動(dòng)地重新分配內(nèi)存。2009-03-03
Oracle根據(jù)逗號(hào)拆分字段內(nèi)容轉(zhuǎn)成多行的函數(shù)說(shuō)明
在做系統(tǒng)時(shí)經(jīng)常會(huì)遇到在一個(gè)字段中,用逗號(hào)或其他符號(hào)分隔存儲(chǔ)多個(gè)信息,下面這篇文章主要給大家介紹了關(guān)于Oracle根據(jù)逗號(hào)拆分字段內(nèi)容轉(zhuǎn)成多行的函數(shù)說(shuō)明,需要的朋友可以參考下2023-04-04

