ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据库CPU高的处理方法(一)

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

原创 Linux操作系统 作者:stpwy 时间:2013-04-19 20:41:04 0 删除 编辑
平时在工作的时候,经常会收到主机监控人员的电话,说某某主机的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博客 ” ,链接:https://blog.itpub.net/469356/viewspace-758908/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-31

  • 博文量
    9
  • 访问量
    40028