统计信息和AUTO SQL TUNING任务重合引发的Library Cache Lock血案

news2025/3/18 23:37:29

一、引言

行里的短信平台,在晚上22:00的时候,突然出现卡顿,卡顿持续1分钟左右,这1分钟内,短信超过30秒才发送成功。因此,对数据库层面开展了一些分析,并且发现了些问题。

二、分析过程

1.查看22:00-22:05的ash信息会话情况,看是否有异常阻塞

select ash.event, count(*)
  from gv$active_session_history ash
 where to_char(sample_time, 'yyyymmddhh24miss') between '20240515215000' and
       '20240515220500'
 group by ash.event
 order by 2 desc;

image.png
可以看到,在这段时间内数据库内发生了大量的library cache lock事件,这明显不是一个正常的现象。

进一步查看是否可以找出阻塞源和被阻塞者:

select inst_id,sample_time,event,session_id,blocking_session
  from gv$active_session_history ash
 where to_char(sample_time, 'yyyymmddhh24miss') between '20240515220000' and
       '20240515221000'
 ORDER BY sample_time,session_id;

image.png
从这里可以看到,sid=573和sid=2272的会话之间产生了阻塞关系,而且同一时间点产生了大量的library cache lock。因此,可以判断这里可能存在问题。

进一步分析,我们可以查看library cache lock的p1,p2,p3值,其中p3值表示为100*mode+namespace(从p3text中可以看到),但其实在这里它包含了三个信息:
1.object_id信息,即library cache lock相关的object;
2.namespace信息,即library cache lock所属的类型;
3.mode信息,表示library cache lock等待的锁模式;

select inst_id,ash.sample_time,
       ash.event,
       ash.sql_id,
       ash.session_id,
       ash.blocking_session,
       ash.P1,
       ash.P2,
       ash.P3,
       ash.P1TEXT,
       ASH.P2TEXT,
       ASH.P3TEXT
  from gv$active_session_history ash
 where to_char(sample_time, 'yyyymmddhh24miss') between '20240515220000' and
       '20240515220500'
 ORDER BY sample_time;

image.png

首先比对p3值,我们可以初步判断被阻塞产生library cache lock的对象和其他library cache的对象实际上是相同的。因此,大量的library cache lock一定是和阻塞源有关的。

通过对p3进行转换:

1.转换成16进制:
select to_char(61959198277635,'xxxxxxxxxxxxxxxxxxxxx') from dual;
SQL>385a00010003

2.高4位转换为object_id:
select to_number('385a','xxxxxxxx') object_id from dual;
SQL>14426

3.中间4位转换成namespace:
select to_number('0001','xxxxxxxx') namespace from dual;
SQL>1

4.第四位转换成mode:
select to_number('0003','xxxxxxxx') mode from dual;
SQL>3

即sid=537的会话,其实对ojbect_id为14426的对象,请求3号锁(其中3为Exclusive,其中2为share锁,1为null,namespace为1。

对于namespace,我们可以通过以下方式获取:

select distinct KGLHDNSP,KGLHDNSD from  x$kglob;

image.png
从图中可以看到namespace=1,代表了table/procedure;同理,通过object_id到dba_objects里面可以查到,锁对象即为数据库中的一张表。
image.png

2.分析阻塞关系

继续分析异常的阻塞关系:

select inst_id,ash.sample_time,
       ash.event,
       ash.sql_id,
       ash.session_id,
       ash.blocking_session,
       ash.P1,
       ash.P2,
       ash.P3,
       ash.P1TEXT,
       ASH.P2TEXT,
       ASH.P3TEXT
  from gv$active_session_history ash
 where to_char(sample_time, 'yyyymmddhh24miss') between '20240515220000' and
       '20240515220500'
 ORDER BY sample_time;

image.png
从这里,我们可以分析出以下信息:
1.sid=573和sid=2272在10点的时候调用了两个dbms_scheduler任务,任务动作是在做ORA$AT_SQ_SQL_SW_90311和ORA$AT_OS_OPT_SY_90309操作;

2.sid=573在执行ORA$AT_OS_OPT_SY_90309任务的时候,需要获取14426对象的X锁,但是被sid=2273阻塞了;

3.由于2273阻塞了573,根据时间线相当于SXSSSSS或XXSSSSS,导致产生了14426对象上的library cache lock;

那么这两个scheduler任务分别在干什么呢?此时,我们则可以从sql_id和历史任务执行情况两个层面分析:
首先,从sqlid上看:

select * from dba_hist_sqltext where sql_id in('cm4tx4a20h982','b6usrg82hwsa3');

其中,sid=573和sid=2273的会话分别执行了以下sql:

573:
call dbms_stats.gather_database_stats_job_proc();

2273:
SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring optimizer_features_enable(default) opt_param('parallel_execution_enabled', 'false')  result_cache OPT_ESTIMATE(@"innerQuery", TABLE, "T", SCALE_ROWS=0.0003127696372) */ C1, C2, C3 FROM (SELECT /*+ qb_name("innerQuery") INDEX( "T" "IDX_TMSGQUEUE_M")  */ COUNT(*) AS C1, 4294967295 AS C2, COUNT(*) AS C3  FROM "TMSGQUEUE" "T" WHERE ("T"."MSGSERIAL">2499999999) AND ("T"."MSGSERIAL"<3000000000)) innerQuery

可以分析出来,573会话在执行统计信息收集任务,2273在做sql_tuning的任务;

为了证实,我们也可以从任务历史执行情况上查看:

select * from dba_autotask_job_history where job_name in('ORA$AT_SQ_SQL_SW_90311','ORA$AT_OS_OPT_SY_90309');

image.png
这里也可以明显的看到,两个任务分别是sql tuning advisor和auto optimizer stats collection,即自动统计信息收集任务和sql tuning advisor任务,且两个任务的触发时间都在晚上10:00的窗口。

从三节点的后台日志中也可以发现,在晚上10:00整的时候,启动了任务SYS_AUTO_SQL_TUNING_TASK。
image.png

三、原因描述

至此,我们就可以比较完整的追溯整个异常过程了。

在晚上10:00的时候,自动统计信息收集窗口和sql tunning advisor同时启用。此时,sql tuning advisor窗口对14426号表进行了优化测试,即sid=2272的SQL,该SQL在执行过程中会对14426号表加2号共享锁。

此时,自动统计信息收集窗口也正好也对14426号表也进行统计信息收集,此时该任务需要对表加X独占锁。

因此,两个锁相互排斥,故造成sid=2272的会话,阻塞了sid=523的会话,发生了library cache lock等待事件。又因为此时相关业务也需要对该表执行insert、select等操作,需要产生共享锁,需要等待523会话对14426号表释放独占锁后,才可以加锁使用,从而产生排队,发生了大量的library cache lock,最终导致业务在一分钟之内运行缓慢。

四、总结

Automatic SQL Tuning是11g引入的一个特性,它可以根据我们数据库的i/o、cpu等负载识别需要调优的sql。在任务设定时间内,则会对识别出的sql进行自动调优,生成sql_profile。当发现有统计信息丢失或者过期的时候,则会通知GATHER_STATS_JOB进行统计信息收集。然后对新的sql_profile进行效率测试。测试通过,则会执行新的profile
这个功能虽然看起来有助于我们对数据库进行更方便的运维,但是实际使用过程中,可能会造成很多性能突变或类似文章中提到的阻塞等问题。
对于DBA来讲,这个功能是一个比较好的辅助优化手段,但很多人也认为这是一个比较鸡肋的功能,所以在最佳实践中都会直接选择关闭该功能,具体方式如下:

begin
     dbms_auto_task_admin.disable(
          client_name => 'sql tuning advisor',
          operation => 'NULL',
          window_name => 'NULL');
end;

当然,这个功能一定程度上可以减轻优化运维工作。因此,如果想使用这个功能,我们也可以根据实际业务情况,选择在业务低峰期再启用这个功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 0 实现一个文件搜索工具 (Java 项目)

背景 各文件系统下, 都有提供文件查找的功能, 但是一般而言搜索速度很慢 本项目仿照 everything 工具, 实现本地文件的快速搜索 实现功能 选择指定本地目录, 根据输入的信息, 进行搜索, 显示指定目录下的匹配文件信息文件夹包含中文时, 支持汉语拼音搜索 (全拼 / 首字母匹配…

CSS伪类实现input聚焦时,上层div样式改变

CSS伪类实现input聚焦时&#xff0c;上层div样式改变 可以使用:focus-within伪类选择器&#xff0c;它会在div内的任何元素获得焦点时选择该div&#xff0c;明确的是&#xff0c;获得焦点和被点击是不相等的&#xff0c;div能被点击&#xff0c;但是不能获得焦点&#xff0c;也…

ViT:1 从DETR说起

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

东哥一句兄弟,你还当真了?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 你还真把自己当刘强东兄弟了?谁跟你是兄弟了?你在国外的房子又不给我住&#xff0c;你出去旅游也不带上我!都成人年了&#xff0c;东哥一句客套话&#xff0c;别当真! 今天&#xff0c;东哥在高管会上直言&…

存储+调优:存储-IP-SAN-EXTENSION

存储调优&#xff1a;存储-IP-SAN-EXTENSION 文件系统的锁标记 GFS&#xff08;锁表空间&#xff09; ----------- ------------ ------------- 节点 | ndoe1 | | node2 | | node3 | ---------- ------…

C++成员函数 - 析构函数

析构函数 析构函数 是特殊的成员函数&#xff0c;其 特征 如下&#xff1a; 1. 析构函数名是在类名前加上字符 ~ 。 2. 无参数无返回值类型。 3. 一个类只能有一个析构函数。若未显式定义&#xff0c;系统会自动生成默认的析构函数。注意&#xff1a;析构函数不能重 载 …

K8S认证|CKA题库+答案| 17. 节点维护

17、节点维护 CKA v1.29.0模拟系统免费下载试用&#xff1a; 百度网盘&#xff1a;https://pan.baidu.com/s/1vVR_AK6MVK2Jrz0n0R2GoQ?pwdwbki 题目&#xff1a; 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Ma…

图论(三)(最小生成树)

一、图的表示&#xff08;简要概述&#xff09; 对于图G&#xff08;V&#xff0c;E&#xff09;&#xff08; V 为节点的集合&#xff0c;E 为边的集合 V*V 的子集&#xff09;有两种表示方法&#xff1a;邻接链表和邻接矩阵&#xff0c;两种表示方法既可以表示有向图&#x…

输入输出(3)——C++的标准输入流

目录 一、cin 流 二、成员函数 get 获取一个字符 (一)无参数的get函数。 (二)有一个参数的get函数。 (三&#xff09;有3个参数的get函数 (四&#xff09;用成员函数 getline 函数读取一行字符 (五&#xff09;用成员函数 read 读取一串字符 (六&#xff09;istream 类…

[机缘参悟-187] - 《道家-水木然人间清醒1》读书笔记 - 真相本质 -10- 关系界限 - 一个人只有放下自我,才能看清世界的真相

目录 一、现实生活中&#xff0c;每个人都是盲人摸象 二、一个人认知的本质是神经网络的模型训练 三、每个人的认知具有局限 四、放下自我&#xff0c;就是跳出自我的认知局限 五、站在上帝的视角&#xff0c;俯瞰不同众生的千差万别的大脑认知系统 六、个体的独特性&…

汇编实现的操作系统

掌握X86汇编语言和GDB程序调试工具对于程序员来说是非常重要的_gdb 查看x86汇编-CSDN博客 掌握编译器和虚拟机的开发有哪些方面的好处-CSDN博客 Ville Mikael Turjanmaan开发的一个操作系统MenuetOS可运行在IA-32, x86-64平台上&#xff0c;完全用 64 位汇编语言编写。功能包…

三、ESP32-IDF之LED

实现 ESP32-S3 的 IO 作为输出功能&#xff0c;实现LED灯以500毫秒闪烁一次 1、GPIO&LED简介 1.1、GPIO简介 GPIO 是负责控制或采集外部器件信息的外设&#xff0c;主要负责输入输出功能。 1.2、LED简介 LED&#xff0c;即发光二极管。 2、硬件设计 (1)原理图 LED 接…

模块化程序设计(函数的定义、调用、参数传递、局部变量、全局变量)

函数的引入&#xff1a; 我们曾经学习了程序设计中的三种基本控制结构&#xff08;顺序、分支、循环&#xff09;。用它们可以组成任何程序。但在应用中&#xff0c;还经常用到子程序结构。 通常&#xff0c;在程序设计中&#xff0c;我们会发现一些程序段在程序的不同地方反复…

[数据集][目标检测]痤疮检测数据集VOC+YOLO格式915张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;915 标注数量(xml文件个数)&#xff1a;915 标注数量(txt文件个数)&#xff1a;915 标注类别…

qmt量化教程4----订阅全推数据

文章链接 qmt量化教程4----订阅全推数据 (qq.com) 上次写了订阅单股数据的教程 量化教程3---miniqmt当作第三方库设置&#xff0c;提供源代码 全推就主动推送&#xff0c;当行情有变化就会触发回调函数&#xff0c;推送实时数据&#xff0c;可以理解为数据驱动类型&#xff0…

有趣的css - 圆形背景动效多选框

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现一个圆形背景动效多选框&#xff0c;适用提醒用户勾选场景&#xff0c;突出多选框选项&#xff0c;可以有效增加用户识别度。 最新文章通过公众号「设计师工作日常」发布…

【完整解析】2024电工杯数学建模A题论文与代码

园区微电网风光储协调优化配置 1 论文2 代码分享2.1 第三题第一问 3 数据与代码 1 论文 2 代码分享 2.1 第三题第一问 function anssq3w1ObjFun(ttt,id); %ttttt(1); tt[750,0,0,1000,600,500]; limttt(1)*200; limmttt(2)*500*0.9-ttt(2)*500*0.1; t1ttt(3)*1000;t2ttt(4)*1…

【spring】@RequestMapping注解学习

RequestMapping介绍 官网地址&#xff1a;Mapping Requests :: Spring Framework RequestMapping 是Spring框架中的一个核心注解&#xff0c;主要用于处理HTTP请求的地址映射。它属于Spring MVC框架的一部分&#xff0c;用于将接收到的Web请求映射到特定的处理器类或处理器方…

MySQL存储过程for循环处理查询结果

在MySQL数据库中&#xff0c;存储过程是一种预编译的SQL语句集&#xff0c;可以被多次调用。在MySQL中使用存储过程查询到结果后&#xff0c;有时候需要对这些结果进行循环处理。 1. 创建表 CREATE TABLE t_job (job_id int(11) unsigned NOT NULL AUTO_INCREMENT,job_name v…

手写tomcat(Ⅰ)——tomcat原理

Tomcat简介 众所周知&#xff0c;动态web项目基本就是使用了tomcat作为服务端 动态web项目的目录结构 Tomcat是一个轻量级的服务器&#xff0c;其实就是一个Java程序&#xff0c;能够作为一个服务端去接收客户端的请求&#xff0c;并返回给客户端响应 Tomcat本身是一个容器…