走进SQL审计视图——《OceanBase诊断系列》之二

1. 前言


在SQL性能诊断上,OceanBase有一个非常实用的功能 —— SQL审计视图(gv$sql_audit)。在OceanBase 4.0.0及更高版本中,该功能是 gv$ob_sql_audit。它可以使开发和运维人员更方便地排查在OceanBase上运行过的任意一条SQL,无论这些SQL是成功与否,都有详细的运行信息记录。这些信息包括客户端和服务端的IP端口、SQL语句、执行时间、执行节点、执行计划ID、会话ID、执行时间、等待时间、总时间、排队时间、以及相关的块读取信息和执行报错信息等。

查询方式说明
(g)v$ob_sql_auditOceanBase 4.0.0.0 及以上版本,gv$xx查询该租户所有机器v$xxx查询该租户本机器(不保证路由准确)
(g)v$sql_auditOceanBase 4.0.0.0 以下版本gv$xx查询该租户所有机器v$xxx查询该租户本机器(不保证路由准确)

sql_audit是基于虚拟表__all_virtual_sql_audit的视图, 该虚拟表对应的数据存放在一个可配置的内存空间中,能够记录并显示每一次SQL请求的来源、执行状态及统计信息,由于存放这些记录的内存是有限的,因此到达一定内存使用量,会触发淘汰。

  • sql_audit 每隔 1s 会检测后台任务并根据以下标准决定是否淘汰:
    • sql_audit 内存最大可使用上限为 avail_mem_limit = min (OBServer 可使用内存 *10%,sql_audit_memory_limit)。
    • 当 avail_mem_limit 在 [64M, 100M] 范围内时, 内存使用达到 avail_mem_limit-20M 时触发淘汰。
    • 当 avail_mem_limit 在 [100M, 5G] 范围内时, 内存使用达到 availmem_limit*0.8 时触发淘汰。
    • 当 avail_mem_limit 在 [5G, +∞)范围内时, 内存使用达到 availmem_limit-1G 时触发淘汰。
    • 当 sql_audidt 记录数超过 900 万条时,触发淘汰。
  • sql_audit 根据以下标准决定是否停止淘汰:
    • 如果是达到内存上限触发淘汰则:
    • 当 avail_mem_limit 在 [64M, 100M] 时, 内存使用淘汰到 avail_mem_limit-40M 时停止淘汰。
    • 当 avail_mem_limit 在 [100M, 5G] 时, 内存使用淘汰到 availmem_limit*0.6 时停止淘汰。
    • 当 avail_mem_limit 在 [5G, +∞] 时, 内存使用淘汰到 availmem_limit-2G 时停止淘汰。
    • 如果是达到记录数上限触发的淘汰则淘汰到 800 万行记录时停止淘汰。

2. sql_audit视图字段介绍

字段名称类型描述
SVR_IPvarchar(32)ip地址
SVR_PORTbigint(20)端口号
REQUEST_IDbigint(20)请求的id号
TRACE_IDvarchar(128)这条语句的trace_id
CLIENT_IPvarchar(32)发送请求的client ip
CLIENT_PORTbigint(20)发送请求的client port
TENANT_IDbigint(20)发送请求的租户id
TENANT_NAMEvarchar(64)发送请求的租户 名称
USER_IDbigint(20)发送请求的用户id
USER_NAMEvarchar(64)发送请求的用户名称
SQL_IDvarchar(32)这条SQL的id
QUERY_SQLvarchar(32768)实际的SQL语句
PLAN_IDbigint(20)执行计划id
AFFECTED_ROWSbigint(20)影响行数
RETURN_ROWSbigint(20)返回行数
PARTITION_CNTbigint(20)该请求涉及的分区数
RET_CODEbigint(20)执行结果返回码
EVENTvarchar(64)最长等待事件名称
P1TEXTvarchar(64)等待事件参数1
P1bigint(20) unsigned等待事件参数1的值
P2TEXTvarchar(64)等待事件参数2
P2bigint(20) unsigned等待事件参数2的值
P3TEXTvarchar(64)等待事件参数3
P3bigint(20) unsigned等待事件参数3的值
LEVELbigint(20)等待事件的level级别
WAIT_CLASS_IDbigint(20)等待事件所属的class id
WAIT_CLASS#bigint(20)等待事件所属的class 的下标
WAIT_CLASSvarchar(64)等待事件所属的class 名称
STATEvarchar(19)等待事件的状态
WAIT_TIME_MICRObigint(20)该等待事件所等待的时间
TOTAL_WAIT_TIME_MICRObigint(20)执行过程所有等待的总时间
TOTAL_WAITSbigint(20)执行过程总等待的次数
RPC_COUNTbigint(20)发送rpc个数
PLAN_TYPEbigint(20)执行计划类型
IS_INNER_SQLtinyint(4)是否内部sql请求
IS_EXECUTOR_RPCtinyint(4)当前请求是否rpc请求
IS_HIT_PLANtinyint(4)是否命中plan_cache
REQUEST_TIMEbigint(20)开始执行时间点
ELAPSED_TIMEbigint(20)接收到请求到执行结束消耗 总时间
NET_TIMEbigint(20)发送rpc到接收到请求时间
NET_WAIT_TIMEbigint(20)接收到请求到进入队列时间
QUEUE_TIMEbigint(20)请求在队列等待事件
DECODE_TIMEbigint(20)出队列后decode时间
GET_PLAN_TIMEbigint(20)开始process到获得plan时间
EXECUTE_TIMEbigint(20)plan执行消耗时间
APPLICATION_WAIT_TIMEbigint(20) unsigned所有application类事件的总时间
CONCURRENCY_WAIT_TIMEbigint(20) unsigned所有concurrency类事件的总时间
USER_IO_WAIT_TIMEbigint(20) unsigned所有user_io类事件的总时间
SCHEDULE_TIMEbigint(20) unsigned所有schedule类事件的时间
ROW_CACHE_HITbigint(20)行缓存命中次数
BLOOM_FILTER_CACHE_HITbigint(20)bloom filter缓存命中次数
BLOCK_CACHE_HITbigint(20)块缓存命中次数
BLOCK_INDEX_CACHE_HITbigint(20)块索引缓存命中次数
DISK_READSbigint(20)物理读次数
EXECUTION_IDbigint(20)执行ID
SESSION_IDbigint(20)session id
RETRY_CNTbigint(20)重试次数
TABLE_SCANtinyint(4)判断该请求是否含全表扫描
CONSISTENCY_LEVELbigint(20)一致性级别
MEMSTORE_READ_ROW_COUNTbigint(20)MEMSTORE中的读行数
SSSTORE_READ_ROW_COUNTbigint(20)SSSTORE中读的行数
REQUEST_MEMORY_USEDbigint(20)该请求消耗的内存
  • 一些重要的事件间隔

3. 基于sql_audit的诊断case

3.1. 最近100s某个租户的TOP SQL耗时监控

  • 检查语句:
-- OceanBase 4.0.0.0及以上版本,请替换tenant_name的值为实际的租户名 
select /*+read_consistency(weak),query_timeout(100000000)*/ SQL_ID,count(1),avg(ELAPSED_TIME),avg(EXECUTE_TIME),avg(QUEUE_TIME),avg(AFFECTED_ROWS),avg(GET_PLAN_TIME) 
from gv$ob_sql_audit  
where time_to_usec(now(6))-request_time <1000000000 
and tenant_name='test_tenant' 
group by SQL_ID order by avg(ELAPSED_TIME)*count(1) desc limit 20;-- OceanBase 4.0.0.0以下版本,请替换tenant_name的值为实际的租户名 
select /*+read_consistency(weak),query_timeout(100000000)*/ SQL_ID,count(1),avg(ELAPSED_TIME),avg(EXECUTE_TIME),avg(QUEUE_TIME),avg(AFFECTED_ROWS),avg(GET_PLAN_TIME) 
from gv$sql_audit  
where time_to_usec(now(6))-request_time <1000000000 
and tenant_name='test_tenant'  
group by SQL_ID order by avg(ELAPSED_TIME)*count(1) desc limit 20 ;
  • 期望值: 观察SQL 整体耗时,cpu_time, 物理读及逻辑消耗是否合理,一般单行insert 和 主键查询 500us以内
  • 对应建议:通过SQL语义与表结构比对,确认执行计划是否合理,耗时是否正常

3.2. 查看集群中 SQL 请求流量是否均匀

  • 思路:我们首先可以查出某个时间段内数据库中所有 SQL 并按照 server 级别进行聚合,再统计该时间段内每台机器上的 QPS。
  • 语句:
-- OceanBase 4.0.0.0及以上版本,请替换t1.tenant_id的值为实际租户的值
select t2.zone, t1.svr_ip,  count(*) as QPS
from oceanbase.gv$ob_sql_audit t1, oceanbase.__all_server t2
where t1.svr_ip = t2.svr_ip and t1.tenant_id = 1001
and IS_EXECUTOR_RPC = 0 and request_time > (time_to_usec(now()) - 1000000)
and request_time < time_to_usec(now())
group by t1.svr_ip   order by QPS;-- OceanBase 4.0.0.0以下版本,请替换t1.tenant_id的值为实际租户的值
select t2.zone, t1.svr_ip,  count(*) as QPS
from oceanbase.gv$ob_sql_audit t1, oceanbase.__all_server t2
where t1.svr_ip = t2.svr_ip and t1.tenant_id = 1001
and IS_EXECUTOR_RPC = 0 and request_time > (time_to_usec(now()) - 1000000)
and request_time < time_to_usec(now())
group by t1.svr_ip   order by QPS;

3.3. 某个时间段请求次数排在 TOP-N 的 SQL

  • 思路:我们首先可以查出某个时间段内数据库中所有 SQL 并按照 sql_id 级别进行聚合,再统计该时间段内每个SQL_ID的 QPS,取出top值。
  • 语句:
-- OceanBase 4.0.0.0及以上版本,请替换tenant_id的值为实际租户的值
select SQL_ID, count(*) as QPS, avg(t1.elapsed_time) RT
from oceanbase.gv$ob_sql_audit t1
where   tenant_id = 1001       and IS_EXECUTOR_RPC = 0
and request_time > (time_to_usec(now()) - 10000000)
and request_time < time_to_usec(now())
group by t1.sql_id order by QPS desc limit 10;-- OceanBase 4.0.0.0以下版本,请替换tenant_id的值为实际租户的值
select SQL_ID, count(*) as QPS, avg(t1.elapsed_time) RT
from oceanbase.gv$sql_audit t1
where   tenant_id = 1001       and IS_EXECUTOR_RPC = 0
and request_time > (time_to_usec(now()) - 10000000)
and request_time < time_to_usec(now())
group by t1.sql_id order by QPS desc limit 10;

3.4. 定位所有SQL中消耗CPU最多的sql

思路:消耗CPU的时间是elapsed_time - queue_time,因为queue_time的过程中是在排队,并不消耗cpu. 排查消耗CPU最多的sql在cpu飙高的场景非常有用

语句:

-- OceanBase 4.0.0.0及以上版本,请替换tenant_id的值为实际租户的值
select sql_id, substr(query_sql, 1, 20) as query_sql, sum(elapsed_time - queue_time) sum_t, count(*) cnt, avg(get_plan_time), avg(execute_time)    
from oceanbase.gv$ob_sql_audit     
where   tenant_id = 1001      and request_time > (time_to_usec(now()) - 10000000)     and request_time < time_to_usec(now())
group by sql_id order by sum_t desc   limit 10;-- OceanBase 4.0.0.0以下版本,请替换tenant_id的值为实际租户的值
select sql_id, substr(query_sql, 1, 20) as query_sql, sum(elapsed_time - queue_time) sum_t, count(*) cnt, avg(get_plan_time), avg(execute_time)    
from oceanbase.gv$sql_audit     
where   tenant_id = 1001      and request_time > (time_to_usec(now()) - 10000000)     and request_time < time_to_usec(now())
group by sql_id order by sum_t desc   limit 10;

3.5. 查看SQL的执行是否出现大量请求不合理的使用了远程执行

思路:sql_audit的PLAN_TYPE字段可以看到该SQL的执行计划类型,

  • plan_type=1 :本地执行计划。性能最好。
  • plan_type=2 : 远程执行计划。
  • plan_type=3 : 分布式执行计划。包含本地执行计划和远程执行计划。

一般情况下,如果出现远程执行比较多时可能时出现切主或proxy客户端路由不准的情况。

语句:

-- OceanBase 4.0.0.0及以上版本,请替换tenant_id的值为实际租户的值
select count(*), plan_type    
from oceanbase.gv$ob_sql_audit     
where tenant_id = 1001          and IS_EXECUTOR_RPC = 0          and request_time > (time_to_usec(now()) - 10000000)         and request_time < time_to_usec(now()) 
group by plan_type ;-- OceanBase 4.0.0.0以下版本,请替换tenant_id的值为实际租户的值
select count(*), plan_type    
from oceanbase.gv$sql_audit     
where tenant_id = 1001          and IS_EXECUTOR_RPC = 0          and request_time > (time_to_usec(now()) - 10000000)         and request_time < time_to_usec(now()) 
group by plan_type ;

3.6. 查询全表扫描的SQL

思路:sql_audit的TABLE_SCAN字段是标识语句是否走了全表扫描,=1 表示全表扫描了。可以进一步分析一下SQL是否可以添加索引来防止全表扫描:

语句:

-- OceanBase 4.0.0.0及以上版本,请替换tenant_id的值为实际租户的值
select query_sql 
from oceanbase.gv$ob_sql_audit 
where table_scan = 1 and tenant_id = 1001 
group by sql_id;-- OceanBase 4.0.0.0以下版本,请替换tenant_id的值为实际租户的值
select query_sql 
from oceanbase.gv$sql_audit 
where table_scan = 1 and tenant_id = 1001 
group by sql_id;

3.7 如何分析RT突然抖动的SQL?

    在线上如果出现RT抖动,但RT并不是持续很高的情况,可以考虑在抖动出现后,立刻将sql audit关闭(alter system set ob_enable_sql_audit = 0),从而确保该抖动的SQL请求在sql audit中存在;然后通过3.3章节的【某个时间段请求次数排在 TOP-N 的 SQL】,分析有异常的SQL。

   如果在sql_audit中找到了对应的RT异常请求,则可以分析该请求在sql audit中记录:

  • 查看retry次数是否很多(RETRY_CNT, 如果次数很多,则是否考虑是否有锁冲突或切主等情况)
  • 查看queue time是不是很大(QUEUE_TIME字段)
  • 查看获取执行计划时间(GET_PLAN_TIME), 如果时间很长,一般会伴随IS_HIT_PLAN = 0, 表示没有命中plan cache)
  • 查看EXECUTE_TIME是否很长,如果很长,则

     a. 查看是否有很长等待事件耗时

     b. 查看访问的行数是否很多, 看SSSTORE_READ_ROW_COUNT, MEMSTORE_READ_ROW_COUNT两个字段, 比如大小账号场景可能导致rt抖动。

第一篇“神医”的修炼秘籍——《OceanBase诊断系列》之一
第二篇一起走进sql_audit性能视图——《OceanBase诊断系列》之二

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

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

相关文章

kafka文件存储机制和消费者

1.broker文件存储机制 去查看真正的存储文件&#xff1a; 在/opt/module/kafka/datas/ 路径下 kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index 如果是6415那么这个会存储在563的log文件之中&#xff0c;因为介于6410和10090之间。 2.…

java mysql八股

mysql中如何定位慢查询 表象&#xff1a;页面加载过慢、接口压测响应时间较长&#xff08;超过1秒&#xff09; 可以采用开源工具如Arthas以及Skywalking&#xff0c;使用skywalking可以检测出哪个接口过慢。同时可以在mysql中开启慢日志查询&#xff0c;设置值为2秒&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人车辆检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发行人车辆检测与计数系统对于提升城市交通管理和监控系统的效率至关重要。本篇博客详细介绍了如何利用深度学习构建一个行人车辆检测与计数系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5…

[Java 探索者之路] 一个大厂都在用的分布式任务调度平台

分布式任务调度平台是一种能够在分布式计算环境中调度和管理任务的系统&#xff0c;在此环境下&#xff0c;各个任务可以在独立的节点上运行。它有助于提升资源利用率&#xff0c;增强系统扩展性以及提高系统对错误的容忍度。 文章目录 1. 分布式任务调度平台1. 基本概念1.1 任…

Java基于SpringBoot的旅游网站的设计与实现论文

目 录 摘 要 2 Abstract 3 1.1 课题开发的背景 4 1.2 课题研究的意义 4 1.3 研究内容 5 第二章 系统开发关键技术 6 2.1 JSP技术介绍 6 2.2 JAVA简介 6 2.3 MyEclipse开发环境 7 2.4 Tomcat服务器 7 2.5 Spring Boot框架 7 2.6 MySQL数据库 8 第三章 系统分析 9 3.1 系统可行性…

实践航拍小目标检测,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测&#xff0c;基于yolov…

使用 llama.cpp 在本地部署 AI 大模型的一次尝试

对于刚刚落下帷幕的2023年,人们曾经给予其高度评价——AIGC元年。随着 ChatGPT 的火爆出圈,大语言模型、AI 生成内容、多模态、提示词、量化…等等名词开始相继频频出现在人们的视野当中,而在这场足以引发第四次工业革命的技术浪潮里,人们对于人工智能的态度,正从一开始的…

JVM(5)

垃圾回收相关 垃圾收集器 警告:纯八股文! 如果说上面我们讲的收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体体现. 垃圾收集器的作用:垃圾收集器是为了保证程序能够正常,持久运行的一种技术,它是将程序中不用的死亡对象也就是垃圾对象进行清除,从而保证新的…

第四十五天| 322. 零钱兑换、279.完全平方数

Leetcode 322. 零钱兑换 题目链接&#xff1a;322 零钱兑换 题干&#xff1a;给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能…

AI大语言模型【成像光谱遥感技术】ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

vscode + git

写在前面&#xff1a; origin分支&#xff1a; 当我们在使用git clone的时候&#xff0c;git会自动地将这个远程的repo命名为origin&#xff0c;拉取它所有的数据之后&#xff0c;创建一个指向它master的指针&#xff0c;命名为origin/master&#xff0c;之后会在本地创建一个…

#WEB前端(HTML属性)

1.实验&#xff1a;a,img 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; a: href插入超链接 默认情况下在本窗口打开链接, target可以设置打开的窗口,parent在父窗口打开&#xff0c;blank新开串口打开,top在顶层串口打开,self为默认在本窗口打开 img: 插入图片 可以插…

解析/区分MOS管的三个引脚G、S、D(NMOS管和PMOS管)

MOS管的三个引脚分别是Gate&#xff08;栅极&#xff09;、Source&#xff08;源极&#xff09;和Drain&#xff08;漏极&#xff09;。以下是详细介绍&#xff1a; Gate&#xff08;栅极&#xff09;。这是控制MOS管开关的关键引脚&#xff0c;用于控制电流的流通。Source&…

智能分析网关V4安全帽检测/反光衣检测/通用工服检测算法及应用

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常…

【DDD】学习笔记-实体和值对象:从领域模型的基础单元看系统设计

今天我们来学习 DDD 战术设计中的两个重要概念&#xff1a;实体和值对象。 这两个概念都是领域模型中的领域对象。它们在领域模型中起什么作用&#xff0c;战术设计时如何将它们映射到代码和数据模型中去&#xff1f;就是我们这一讲重点要关注的问题。 另外&#xff0c;在战略…

springboot238光影视频

光影视频平台 摘 要 使用旧方法对光影视频平台的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在光影视频平台的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开…

wy的leetcode刷题记录_Day80

wy的leetcode刷题记录_Day80 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-2 前言 目录 wy的leetcode刷题记录_Day80声明前言2368. 受限条件下可到达节点的数目题目介绍思路代码收获 92. 反转链表 II题目介绍思路代码收获 2368…

Redis持久化+Redis内存管理和优化+Redis三大缓存问题

Redis持久化Redis内存管理和优化Redis三大缓存问题一、Redis高可用二、Redis持久化1、RDB持久化1.1 触发条件(1) 手动触发(2) 自动触发(3) 其他自动触发机制 1.2 执行流程1.3 启动时加载 2、AOF持久化2.1 开启AOF2.2 执行流程(1) 命令追加(append)(2) 文件写入(write)和文件同步…

langchain学习笔记(十)

Bind runtime args | &#x1f99c;️&#x1f517; Langchain 1、有时&#xff0c;我们希望使用常量参数调用Runnable序列中的Runnable&#xff0c;这些参数不是序列中前一个Runnable的输出的一部分&#xff0c;也不是用户的输入&#xff0c;这时可以用Runnable.bind() from …

关于synchronized介绍

synchronized的特性 1. 乐观锁/悲观锁自适应,开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁 2.轻量级/重量级锁自适应 开始是轻量级锁实现,如果锁被持有的时间较长,就转换成重量级锁 3.自旋/挂起等待锁自适应 4.不是读写锁 5.非公平锁 6,可重入锁 synchronized的使用 1&#…