博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]定位占用oracle数据库cpu过高的sql
阅读量:7169 次
发布时间:2019-06-29

本文共 2239 字,大约阅读时间需要 7 分钟。

 

    今天在吃饭的时候我的朋友的数据库出现了问题,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  oracle    6517  6513  9 20:28 ?        00:00:24 oracleRHYS (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))  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'))    SQL_TEXT  ----------------------------------------------------------------  delete from amy_emp

     可知,当前用户正在进行删除表的操作,本次就是通过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

转载于:https://www.cnblogs.com/myrunning/p/5550904.html

你可能感兴趣的文章
我的友情链接
查看>>
linux下的软硬链接
查看>>
【JAVA的 IO流之FileInputStream和FileOutputStream】
查看>>
远程连接mysql 授权方法详解
查看>>
FreeBSD网络配置
查看>>
@synthesize window=_window; 的理解
查看>>
Greenlet理解要点
查看>>
罗森伯格应邀主讲CDCC百家大讲堂38期
查看>>
How to Install Nextcloud 13 Server on Debian 9
查看>>
[深入理解文件系统之一] IO系统调用
查看>>
Java之implements
查看>>
【资料收集】林内域或者林间域之间的账户、计算机迁移
查看>>
更新windows SID工具,对于虚拟机复制很有用
查看>>
安装TOMCAT
查看>>
-bash: lsof: command not found 解决方法
查看>>
《.NET应用架构设计:原则、模式与实践》新书博客--试读-2.1.2 设计原则实战
查看>>
大家技术探讨
查看>>
使用Myeclipse自带的xFire来实现WebService
查看>>
《UNIX环境高级编程》apue.h 头文件的问题
查看>>
系统分析师证书求挂靠,请联系qq 369681392
查看>>