如何查询占CPU高的oracle进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何查询占CPU高的oracle进程相关的知识,希望对你有一定的参考价值。

oracle占用cpu过高怎么处理,本文将介绍有关oracle进程CPU占用率过高的问题,需要了解跟多的朋友可以参考下
1:首先使用TOP命令传到占用CPU高的SPID号
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
3575 oracle 1 12 0 0K 0K run 748.6H 24.98% oracle
3571 oracle 1 22 0 0K 0K sleep 706.2H 22.84% oracle

2:使用DBA账户登录数据库,使用以下SQL语句查询:
SELECT * FROM V$PROCESS WHERE spid=3575;查询到SQL相关信息
3:根据以上查询到的信息使用以下SQL查询:
SELECT sid, program FROM V$SESSION S WHERE EXISTS(SELECT 1 FROM V$PROCESS WHERE spid=3575 AND ADDR = S.PADDR);
可以查询到具体那个客户端查询一直在不断占用ORACLE资源!
最后对这个查询进行处理!

4.根据SID查得SQLITPUB

复制代码代码如下:

select sql_textITPUB
from v$sqltext
where a.hashvalue=(select sql_hash_value
from v$session b
where b.SID=\'&sid\')
0order by piece ASC;

根据lockwait字段可以查询当前正在等待的锁的相关信息:

复制代码代码如下:

select * from v$lock where kaddr in (select lockwait from v$session where sid= $sid);
(sql_address,sql_hash_value),(prev_sql_addr,prev_hash_value) 根据这两组字段, 可以查询到当前session正在执行的或最近一次执行的sql语句的详细信息:
select * from v$sqltext where address = &sql_address and hash_value = &sql_hash_value;

根据PID查SQL相关信息:

复制代码代码如下:

select id,serial# ,username,osuser,machine,program,process,to_char(logon_time,\'yyyy/mm/dd hh24:mi:ss\') logon from v$session where paddr in ( select addr from v$process where spid in(\'&pid\'));

根据PID查SQL语句

复制代码代码如下:

SELECT a.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text FROM v$session a,v$process b,v$sqltext c WHERE b.spid=\'&spid\' AND b.addr=a.paddr AND a.sql_address=c.address(+) ORDER BY c.piece;

得到进程的sid号:

复制代码代码如下:

select id,serial# ,username,osuser,machine,program,process,to_char(logon_time,\'yyyy/mm/dd hh24:mi:ss\') logon from v$session where paddr in ( select addr from v$process where spid in(\'&pid\'));

得到session的sqltext语句:

复制代码代码如下:

select sql_text from v$sqltext_with_newlines where hash_value in (select SQL_HASH_VALUE from v$session where paddr in (select addr from v$process where spid= \'&pid\')) order by piece;
参考技术A 在 unix(linux) 系统中可以使用top或类似命名查询出 占CPU高的 oracle进程
然后 通过 select s.* from v$session s ,v$process p where s.paddr=p.addr and p.spid = XXXX 的方式查询出具体的oracle连接(回话)
得到 session 之后,可以继续查询该 session的 sql 语句等
参考技术B 在任务管理器里面的进程里可以看到

[转]定位占用oracle数据库cpu过高的sql

 

    今天在吃饭的时候我的朋友的数据库出现了问题,cpu占用率为97%,当我看到这个问题的时候我就想到了或许是sql导致的此问题,由于忍不住吃饭,暂时没有帮他看这个问题,这是我饭后自己模拟的故障,进行的分析:

 1)查看一下cpu进程占用情况:

 

 

看到oracle进程为6331,6517等这几个进程占用cpu过高。

 

2)查看相关进程信息:

[oracle@oracle-one ~]$ ps -ef | grep 6331  
oracle    6331     1 23 20:24 ?        00:02:05 ora_vktm_RHYS  
oracle    6555  6385  0 20:32 pts/2    00:00:00 grep 6331  
[oracle@oracle-one ~]$ ps -ef | grep 6517  
<span style="color:#ff0000">oracle    6517  6513  9 20:28 ?        00:00:24 oracleRHYS (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))  
</span>oracle    6557  6385  0 20:33 pts/2    00:00:00 grep 6517  
[oracle@oracle-one ~]$   

 

 

3)查看该会话信息: 

SQL> select sid,serial#,username,machine,osuser,process from v$session s  
  2     where s.paddr=(select addr from v$process p where p.spid=\'&pid\');  
Enter value for pid: 6517  
old   2:    where s.paddr=(select addr from v$process p where p.spid=\'&pid\')  
new   2:    where s.paddr=(select addr from v$process p where p.spid=\'6517\')  
  
       SID    SERIAL# USERNAME     MACHINE         OSUSER                         PROCESS  
---------- ---------- ----------- ---------------- ------------------------------ ------------------------  
         1         21 RHYS         oracle-one      oracle                         6513  

可知:session 的信息为sid:1  serial#:21 数据库用户为:RHYS,客户端机器为:oracle-one,操作系统用户为:oracle 进程号:6513 

 

4)查看该会话正在运行的sql: 

SQL> select sql_text from v$sqltext  
  2   where (address,hash_value) in (  
  select sql_address,sql_hash_value from v$session s   
  3    4        where s.paddr=  
  5       (select addr from v$process p where p.spid=\'&pid\'));  
Enter value for pid: 6517  
old   5:      (select addr from v$process p where p.spid=\'&pid\'))  
new   5:      (select addr from v$process p where p.spid=\'6517\'))  
  
<span style="color:#ff0000">SQL_TEXT  
----------------------------------------------------------------  
delete from amy_emp</span>  

     可知,当前用户正在进行删除表的操作,本次就是通过v$process 的spid找到进程号,然后找到v$session 的addr地址,然后找到v$sqltext的sql_address以及sql_hash_value,

     通过这两个字段就可以定位出唯一的sql_text,本次通过v$process,v$session,v$sql_text三个视图结合找到相应的sql;

 

5)后续处理

      如果该session为非法的,可以使用如下命令杀掉该会话:   alter  sytem kill  session \'1,21\';  

      既然找到sql了,那么 我们就可以通知应用相关人员,确认是否在进行相关数据操作。

     另外我们也可以使用dbms_system包对该session进行更加详细的跟踪。

 

 

比价老的一篇文章,转自:http://www.bitscn.com/pdb/oracle/201309/241814.html

以上是关于如何查询占CPU高的oracle进程的主要内容,如果未能解决你的问题,请参考以下文章

[转]定位占用oracle数据库cpu过高的sql

Linux下分析某个进程CPU占用率高的原因

oracle造成系统CPU过高的检查sql

如何定位cpu占用率高的java线程

java 多线程 cpu 占用率高的问题

c程序cpu占用率