平时在工作的时候,经常会收到主机监控人员的电话,说某某主机的CPU特别的高,而且都是Oracle的进程占用的,你去看看吧,相信做维护DBA的人都很熟悉这种场景,我想大家处理这种问题的方法也大致相同,下面把我处理的步骤写出来,和大家分享一下.
处理思路如下:
CPU高,那首先我们要定位到是哪些会话比较占用CPU,并且在做什么事情,这样才方便我们做下一步的处理
1. 利用系统的sar,vmstat等工具确认一下CPU的利用率
既然主机说高了,那CPU肯定是高了,为啥还要去确认呢?我想说的是,不管哪里反应给我们什么问题,我们第一时间是要去确认问题,养成一个良好的习惯,呵呵
sar 1 10
vmstat 1 10
2. 利用主机的top(linux)工具得到最占用CPU的进程ID
在Linux中,我们可以使用top命令得到
在AIX中,我们可以使用topas命令,在HPUX中我们可以使用glance命令来得到,大同小异
当然我们也可以进一步的指定参数,使得到的结果更加干净,比如HPUX:
glance -u oracle(只显示Oracle的用户进程)
Linux下: top -u oracle
在输出的列表中,得到占用CPU一定程度的进程,根据实际情况而定
比如单CPU系统中,10%都已经算很高了
但是对于动辄几十个CPU的系统,可能90%以上才算比较高.
3. 利用下面SQL查询出来系统进程ID对于的SID,serial#,username,machine,program,event,sql_id,甚至是sql_text等内容
set linesize 170 pagesize 999 long 999999
column sid format 9999
column event format a20
column username format a10
column machine format a16
select s.sid,s.serial#,s.username,s.status, s.MACHINE, s.sql_id, sq.sql_fulltext, s.event
from v$session s,v$process p,v$sql sq
where s.PADDR=p.ADDR
and s.sql_id = sq.sql_id
and p.spid in (需要查询的进程ID列表,用逗号隔开)
order by s.sid;
4.联系应用人员,看这些会话都是在干啥的,一般情况下这些会话都是一些批量操作的语句,问他们能不能杀或者停掉业务,问题解除.
附,几种快捷生成批量杀会话的语句:
--拼接访问某表的Kill Session脚本
--拼接访问某用户某表的Kill Session脚本
select 'alter system kill session ''' || sid || ',' || serial# || ''';' SQLCOMMAND
from v$session s, v$sqlstats st
where username = upper('&owner')
and sid not in (select distinct sid from v$mystat)
and s.sql_id = st.sql_id
and UPPER(st.sql_fulltext) like UPPER('%&table%');
-- kill某表上的所有会话
select s.inst_id,'alter system kill session ''' || sid || ',' || serial# || ''';' SQLCOMMAND
from gv$session s,gv$sqlstats st
where sid not in (select distinct sid from v$mystat)
and s.inst_id = st.inst_id
and s.sql_id = st.sql_id
and UPPER(st.sql_fulltext) like UPPER('%&table%');
set linesize 170 pagesize 999 long 999999
column sid format 9999
column event format a20
column username format a10
column machine format a16
select s.sid,s.serial#,s.username,s.status, s.MACHINE, s.username, st.sql_text
from gv$session s,gv$sqlstats st
where sid not in (select distinct sid from v$mystat)
and s.inst_id = st.inst_id
and s.sql_id = st.sql_id
and UPPER(st.sql_fulltext) like UPPER('%&table%');
-- 拼接操作系统Kill命令
-- 操作系统级kill数据库标记为KILLED的进程
select 'host kill -9 ' || spid CMD
from v$process
where v$process.ADDR in (select v$session.PADDR
from v$session
where v$session.status = 'KILLED');
-- 操作系统级kill某等待事件的进程
select 'host kill -9 ' || spid CMD
from v$process
where v$process.ADDR in (select v$session.PADDR
from v$session
where s.event = '&waitevent');
--
select 'host kill -9 ' || spid CMD
操作系统级kill访问某表的进程
from v$process
where v$process.ADDR in (select s.PADDR
from v$session s,v$sqlstats st
where sid not in (select distinct sid from v$mystat)
and s.sql_id = st.sql_id
and UPPER(st.sql_fulltext) like UPPER('%&table%'));
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/469356/viewspace-758908/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/469356/viewspace-758908/