oracle占用CPU100%
背景:迁移4.5迎新windows数据库服务器后,经常出现cpu100%占用,后来排查到是迎新系统有财务的定时调度,数据量比较大导致cpu占满。此文档记录查到原因的过程与解决方案。
windows有个很强大的软件Process Explorer
下载这个软件,里面有3个可执行文件,选第一个就行,放到问题服务器上(数据库服务器)
打开任务管理器,发现是oracle rdbms占用cpu较高
打开该软件,找到oracle rdbms进程,双击,点击Threads
查看到使用最高的线程tid
进入plsql,查询sql_id
需要多次执行,找到出现频率最高的sql_id
select sql_id from v$session where paddr in( select addr from v$process where spid in('70224') )
根据6中的sql_id查询具体执行占用CPU过高的sql语句
这时就可以判断出是什么sql语句在占用cpu,这里查到是财务缴费的sql语句
select * from v$sqlarea where sql_id in(sql_id1,sql_id2,sql_id3...);
根据6中的sql_id,查询sid和serial
需要多次执行,找到出现频率最高的(执行一次可能会查询不到,因此需要多执行)
SELECT sid,serial#,sql_id from v$session where sql_id in(sql_id1,sql_id2,sql_id3...)
杀掉进程
alter system kill session 'sid,serial#';
这时问题得以解决,但只是暂时的,因为迎新会定时调度执行,到时候还是会占用。
因此后期还需要排查为什么会占用,优化sql,当然这些工作就交给研发,我们排查到这里就可以了。
如果不是sql占用导致的,也有可能是监听的日志文件较大导致的。
原因:windows的oracle数据库会有这种情况,不会自动清理监听日志,需要我们手动清理
解决:
- 找到监听日志地址
/u01/app/grid_base/diag/tnslsnr/rac1/listener/trace
- 如果过大就清空即可