欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle实例占用超高CPU排查

程序员文章站 2022-06-04 18:30:19
CPU主要功能:处理指令、执行操作、要求进行动作、控制时间、处理数据。 结合数据库实例CPU占用高,可能的原因是数据库在执行大量的操作(全表查询、大量排序等)。 由于公司没有DBA,遇到数据库问题只能自己排查。 一、是否存在死锁 查询死锁以及解锁的语句参考下方: 查看死锁ID 查看死锁ID SELE ......

cpu主要功能:处理指令、执行操作、要求进行动作、控制时间、处理数据。

结合数据库实例cpu占用高,可能的原因是数据库在执行大量的操作(全表查询、大量排序等)。

由于公司没有dba,遇到数据库问题只能自己排查。

一、是否存在死锁

查询死锁以及解锁的语句参考下方:
  • 查看死锁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没有降下来,只能重新排查。

二、借助plsql查询定时job和session

通过pl/sql查询到,不存在定时的job执行。
通过tools-sessions,发现存在较多数据库连接与访问,但较难定位到具体那个sql或表存在问题。
于是,kill了所有session,cpu得到缓解,但根本原因未查到,隔几分钟又反复了。

三、查询数据库中的等待事件

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发现存在多表(百万数据)全量关联查询。

于是对数据以及sql进行了相应优化,cpu占用较高问题得到根本解决。

四、过程总结

造成cpu暴增的原因有很多,思路也有很多,后续如果遇到可以参考上述思路,精准定位到问题并进行优化。