记一次oracle数据库瞬时卡顿排查过程

CSDN,墨天伦ID:潇湘秦 转载请注明出处
symptoms
昨天晚上10点钟收到邮件报警,提示有超量的异常等待事件
记一次oracle数据库瞬时卡顿排查过程_第1张图片

异常的等待事件为 library cache lock
我这里监控的异常等待事件标准为,只要出现超过阈值的等待一定会影响数据库的性能,避免频繁的报警
##监控异常等待的脚本放在本文的最后
记一次oracle数据库瞬时卡顿排查过程_第2张图片

不久用户端开始在微信群中反馈,系统出现卡顿和部分超时问题

过了十分钟后用户端反应已经恢复,报警也没有继续出现,则可以判定已经恢复,继续睡觉第二天再继续追查
记一次oracle数据库瞬时卡顿排查过程_第3张图片

问题排查过程

追查过往的数据库异常状态常见的办法有OEM或者AWR报表
在OEM选择 问题数据库-性能主页-性能概览-历史,可以看到相关异常波峰

OEM的详细搭建可以参考我的这篇博文

https://www.modb.pro/db/647677
记一次oracle数据库瞬时卡顿排查过程_第4张图片
记一次oracle数据库瞬时卡顿排查过程_第5张图片

拉取问题时段的AWR 也可以看到top1 foreground wait event 为library cache lock
记一次oracle数据库瞬时卡顿排查过程_第6张图片

熟悉的library cache lock的DBA应该可以 很容易判断出library cache相关的等待是和share pool的数据结构相关,

可能发生library cache pin和library cache lock的情况:

1、在存储过程或者函数正在运行时被编译。
2、在存储过程或者函数正在运行时被对它们进行授权、或者移除权限等操作。
3、对某个表执行DDL期间,有另外的会话对该表执行DML或者DDL。
4、PL/SQL对象之间存在复杂的依赖性

Library cache lock/pin详解 参看我CSDN文章
https://blog.csdn.net/xiaofan23z/article/details/7699778

首先想到的应该就是 是否有DDL相关的操作

造成了大量的library cache的等待,这时就需要查一下问题时段的DDL记录 ;oracle本身是不会记录DDL的log的,这需要DBA提前对数据库做好DDL的log,

这样遇到问题时才方便排查,具体的DDL log记录脚本请参考如下博文

https://www.modb.pro/db/1746798614500429824

查询最近一天的DDL记录可以看到出问题时段有一些CMP开头的表被创建和删除, 还有部分temp表被创建和删除

module都是DBMS_SCHEDULER

再查询一下schedule job

select * from DBA_SCHEDULER_JOB_RUN_DETAILS;
找到执行时间符合的job
记一次oracle数据库瞬时卡顿排查过程_第7张图片

从JOB name和执行时间 就可以判定为autotask相关的任务,alert log中也有记录
记一次oracle数据库瞬时卡顿排查过程_第8张图片

11g的自动维护任务
记一次oracle数据库瞬时卡顿排查过程_第9张图片
oracle 11g中默认的自动维护任务分三类:
Automatic Optimizer Statistics Collection (自动优化器统计信息收集)**收集数库中所有无统计信息或仅有过时统计信息的 schema 对象的 Optmzer(优化)统计信息,SQL query optimizer(SQL 查询优化器)使用此任务收集的统言息提高 SQL 执行的性能。
Automatic Segment Advisor (自动段指导)*识别有可用回收空间的段,并提出如何消除这当段中的碎片的建议,也可以手动运行 Segment Advisor 获取更多最新建议,或获取 Automatic segment Advisor 没有检查到的那些有可能做空间回收的段的建议。
Automatic SOL Tuning Advisor (自动 SOL优化指导)
检查高负载 SQL语句的性能,并提出如何优化这些语句的建议。您可以配置此指导,自动应用建议的SQL profile.

Solution

这里造成影响的主要是 ‘auto space advisor’ 和’sql tuning advisor’ 处理办法比较简单就是把这两个定时任务关闭

这不是第一次遇到autotask对生产造成影响,生产环境建议可以关闭。

EXEC DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto space advisor',operation => NULL, window_name => NULL);
EXEC DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'sql tuning advisor',operation => NULL, window_name => NULL);

确认修改结果

SELECT CLIENT_NAME, STATUS FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME in ( 'auto space advisor','sql tuning advisor');

后记:

想迅速的定位问题依赖于数据支撑,数据依赖于监控或者统计信息,有些是系统自带的,有些需要运维自行添加

1.OEM监控平台对于监控oracle 还是非常好用的

2.记录DDL log一是可以方便审计追溯,二是方便调优排障

3.wait event 监控可以及时发现问题,及时处理

CMP$表和压缩相关属于auto space advisor范畴 参考如下官方文档Doc ID 1606356.1

Is Table SCHEMA.CMP4$xxxxxx Or Similar Related To Compression Advisor? (Doc ID 1606356.1)

附异常等待事件监控脚本

1.shell脚本 check_wait_event.sh
#!/bin/bash
#
#name: check_wait_event.sh
#purpose: check wait event
#2022-08-10 add by norton

  rm -f /tmp/check_wait_event.html

  ORACLE_SID=orcl  #修改sid
  export ORACLE_SID
  ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1  ##修改oracle home
  export ORACLE_HOME
  HOST_NAME=`uname -n`
  export HOST_NAME
  JOB_PWD=$HOME/jobs
  export JOB_PWD

  $ORACLE_HOME/bin/sqlplus -s "/ as sysdba"<<!
    @$JOB_PWD/check_wait_event 
    exit
!

  var=`cat /tmp/check_wait_event.html|wc -l`

  #echo $var
  if [[ $var -gt 11 ]];
  then
    # echo "**********************************************************************"
    # echo "There are alerts"
    echo "please contact DBA  xxxx"|mailx -s "  Check Wait Event Alert"  -a  /tmp/check_wait_event.html `cat $JOB_PWD/base_mail.addr|grep -v \#`   ###base_mail.addr 存放收件人邮箱
    # echo "**********************************************************************"
    # exit
  fi
  shift
done

-----------------------------------------------------------
2.sql脚本
/*
    Program:  check_wait_event.sql
    Purpose:  notice no idle wait event
    History:
        Rev     Date        Author           Description
        -----   ----------  -------------    -----------------  
        1.0     10-aug-2022   norton       Create the script 
*/

SET markup html ON spool ON entmap OFF


SET echo OFF
SET verify OFF
SET feedback OFF
SET termout OFF
SET pagesize 25
SET appinfo 'check_wait_event.sql' 


COLUMN event  format a35   heading "EVENT"
COLUMN wait_num        format 99,999 heading  "WAIT_NUM"

spool /tmp/check_wait_event.html


ttitle center "List NO IDLE wait time"  skip 2
 

select event,count(1) as wait_num  from gv$session_wait
where event in ('enq: TX - row lock contention',
'library cache lock','library cache pin','cursor: pin S wait on X')   /*可以根据需要添加需要监控的wait event*/
group by event
having count(1)>5;


SET markup html OFF
spool OFF
SET pagesize 14
ttitle OFF
SET feedback ON
SET termout ON
SET appinfo OFF
SET echo ON

EXIT
复制

你可能感兴趣的:(oracle,案例解决,数据库,oracle)