zoukankan      html  css  js  c++  java
  • Oracle实例占用超高CPU排查

    CPU主要功能:处理指令、执行操作、要求进行动作、控制时间、处理数据。

    结合数据库实例CPU占用高,可能的原因是数据库在执行大量的操作(全表查询、大量排序等)。

    由于公司没有DBA,遇到数据库问题只能自己排查。

    一、是否存在死锁

    查询死锁以及解锁的语句参考下方:
    • 查看死锁ID
    SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
    l.Oracle_USERNAME,l.OS_USER_NAME,l.PROCESS FROM V$LOCKED_OBJECT
    l,V$SESSION S WHERE l.SESSION_ID=S.SID;
    • 查看表名称
    select b.owner,b.object_name,a.session_id,a.locked_mode  from v$locked_object a,dba_objects b  where b.object_id = a.object_id; 
    • 手工关闭死锁
    alter system kill session ‘sid,serial#’; (其中sid=l.session_id) 
    通过查询死锁也发现了一些死锁,杀掉后CPU没有降下来,只能重新排查。

    二、借助PLSQL查询定时job和session

    通过PL/SQL查询到,不存在定时的JOB执行。
    通过Tools-Sessions,发现存在较多数据库连接与访问,但较难定位到具体那个sql或表存在问题。
    于是,Kill了所有Session,CPU得到缓解,但根本原因未查到,隔几分钟又反复了。

    三、查询数据库中的等待事件

    SELECT P.PID,
    S.SID,
    S.SERIAL#,
    S.USERNAME,
    Q.SQL_ID,
    Q.SQL_TEXT,
    Q.SQL_FULLTEXT,
    W.EVENT,
    W.WAIT_TIME,
    W.STATE,
    CASE
    WHEN W.STATE = 'WAITING' THEN
    W.SECONDS_IN_WAIT
    WHEN W.STATE = 'WAITING KNOWN TIME' THEN
    W.WAIT_TIME
    END AS SEC_IN_WAIT
    FROM V$SESSION S, V$SESSION_WAIT W, V$SQLAREA Q, V$PROCESS P
    WHERE S.SID = W.SID
    AND S.SQL_ID = Q.SQL_ID
    AND P.ADDR = S.PADDR
    AND W.EVENT NOT LIKE 'SQL*Net%'
    AND S.USERNAME IS NOT NULL
    AND W.WAIT_TIME >= 0
    ORDER BY W.WAIT_TIME DESC;

    发现存在等待事件,分析待执行的SQL发现存在多表(百万数据)全量关联查询。

    于是对数据以及SQL进行了相应优化,CPU占用较高问题得到根本解决。

    四、过程总结

    造成CPU暴增的原因有很多,思路也有很多,后续如果遇到可以参考上述思路,精准定位到问题并进行优化。

  • 相关阅读:
    xtrabackup执行备份要拥有的权限
    CentOS 7 下yum安装xtrabackup备份工具
    MySQL read_only选项的作用
    Linux进程管理命令
    MySQL二进制日志中保存的上下文信息
    MySQLdb的安装
    MySQL The password hash doesn't have the expected format.
    web框架本质
    进程和线程
    good blog
  • 原文地址:https://www.cnblogs.com/panda-sweets/p/12121622.html
Copyright © 2011-2022 走看看