数据库CPU高的处理方法(一)

平时在工作的时候,经常会收到主机监控人员的电话,说某某主机的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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值