如何定位占用oracle数据库cpu过高的sql?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何定位占用oracle数据库cpu过高的sql?相关的知识,希望对你有一定的参考价值。

参考技术A ORACLE查询当前执行效率低的sql\\x0d\\x0a  --CPU高的SQL\\x0d\\x0a  select sql_text from v$sql order by cpu_time desc\\x0d\\x0a  --逻辑读多的SQL:\\x0d\\x0a  select * from (select buffer_gets, sql_text\\x0d\\x0a  from v$sqlarea\\x0d\\x0a  where buffer_gets > 500000\\x0d\\x0a  order by buffer_gets desc) where rownum<=30;\\x0d\\x0a  --执行次数多的SQL :\\x0d\\x0a  select sql_text,executions from\\x0d\\x0a  (select sql_text,executions from v$sqlarea order by executions desc)\\x0d\\x0a  where rownum<81;\\x0d\\x0a  --读硬盘多的SQL :\\x0d\\x0a  select sql_text,disk_reads from\\x0d\\x0a  (select sql_text,disk_reads from v$sqlarea order by disk_reads desc)\\x0d\\x0a  where rownum<21;

[转]定位占用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

以上是关于如何定位占用oracle数据库cpu过高的sql?的主要内容,如果未能解决你的问题,请参考以下文章

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

Oracle 占用cpu过高的处理办法

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

如何查询占CPU高的oracle进程

Oracle查询语句导致CPU使用率过高问题处理

Java如何定位占用CPU比较高的问题