问题现象
linux环境,数据库cpu一直处于100%。业务系统运行很慢。top命令结果如下:
问题分析
方法1
根据上图中的oracle进程在操作系统对应的 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查询在数据库中执行缓慢的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;
发现耗时sql如下
--- sql-1 --- 这个 sql 语句用于获取特定用户活动会话相关的执行计划,并以一种特定的格式展示这些信息 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 --- 监控和分析数据库中活动会话的执行情况 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找到当时执行时对应的执行计划:
select * from table(dbms_xplan.display_awr('6h6zz42n9rmnw'));
解决方案
1、经过沟通,发现相关的sql是由于nmc调用了oracle监控脚本导致的。
nmc\server\conf\monitor.properties 文件中配置的监控脚本 。注释掉即可 。
2、停止nmc,杀掉相关数据库会话。
以上就是oracle进程占用cpu100%的问题分析及解决方法的详细内容,更多关于oracle进程占用cpu100%的资料请关注代码网其它相关文章!
发表评论