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


欢迎关注作者 分享更多数据库安装配置,troubleshooting,调优,备份恢复知识和案例
CSDN:潇湘秦-CSDN博客
公众号:潇湘秦

symptoms
昨天晚上10点钟收到邮件报警,提示有超量的异常等待事件
在这里插入图片描述

异常的等待事件为 library cache lock
我这里监控的异常等待事件标准为,只要出现超过阈值的等待一定会影响数据库的性能,避免频繁的报警
##监控异常等待的脚本放在本文的最后
在这里插入图片描述

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

过了十分钟后用户端反应已经恢复,报警也没有继续出现,则可以判定已经恢复,继续睡觉第二天再继续追查
在这里插入图片描述

问题排查过程

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

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

https://www.modb.pro/db/647677
在这里插入图片描述
在这里插入图片描述

拉取问题时段的AWR 也可以看到top1 foreground wait event 为library cache lock
在这里插入图片描述

熟悉的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
在这里插入图片描述

从JOB name和执行时间 就可以判定为autotask相关的任务,alert log中也有记录
在这里插入图片描述

11g的自动维护任务
在这里插入图片描述
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
复制

欢迎关注作者
公众号:潇湘秦的DBA之路
墨天伦:潇湘秦的个人主页 - 墨天轮

在这里插入图片描述

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!我是 C知道,很高兴能够帮到您。针对Oracle数据库查询卡顿的问题,可以尝试以下几个方法进行排查和优化: 1. 索引优化:确认查询语句是否使用了适当的索引。使用EXPLAIN PLAN语句来分析查询执行计划,确保Oracle使用了正确的索引来执行查询。如果没有合适的索引,可以考虑创建新索引或修改现有索引。 2. 统计信息更新:确保表和索引的统计信息是最新的。使用ANALYZE语句或DBMS_STATS包来收集或更新统计信息,以便Oracle优化查询计划。 3. 查询重写:对于复杂的查询语句,可以考虑使用视图或内联视图进行查询重写,以简化查询逻辑或提高性能。 4. 查询调整:检查查询语句是否能够通过重写或优化来提高性能。例如,避免使用不必要的连接操作或子查询,尽可能减少数据读取量等。 5. 硬件资源优化:确保数据库服务器具有足够的内存、磁盘空间和处理能力来支持数据库查询。根据实际情况,适当调整数据库参数设置,如SGA大小、PGA大小、IO设置等。 6. 并发控制优化:如果查询卡顿是由于多个并发事务引起的,可以考虑调整并发控制机制,如锁定粒度、事务隔离级别等。 7. 服务器性能监控:使用Oracle提供的性能监控工具,如AWR报告、ASH报告等,来分析数据库服务器的性能瓶颈,找出导致查询卡顿的原因。 希望以上方法能够帮助您解决Oracle数据库查询卡顿的问题。如果还有其他疑问,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇湘秦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值