当前位置: 代码网 > it编程>数据库>Oracle > Oracle进程占用CPU100%的问题分析及解决方法

Oracle进程占用CPU100%的问题分析及解决方法

2024年08月22日 Oracle 我要评论
问题现象linux环境,数据库cpu一直处于100%。业务系统运行很慢。top命令结果如下:问题分析方法1根据上图中的oracle进程在操作系统对应的 pid号 : 如 6999,8100 等通过下面

问题现象

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%的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com