如何通过日志或gv$sql_audit,分析OceanBase运行时的异常SQL

news2024/9/21 8:04:30

本文作者:郑增权,爱可生 DBA 团队成员,OceanBase 和 MySQL 数据库技术爱好者。本文约 2000 字,预计阅读需要 8 分钟。

简介

在 OCP 云平台的 Top SQL 界面中,能观察到异常SQL,但这些SQL并未明确显示具体的报错原因,或者提供了报错原因,但还不够详细。

本文以 SQL 异常重试的案例,通过 日志文件 和 gv$sql_aduit 视图 这两种方法,分析并确定OceanBase运行过程中,出现报错的具体原因。

建议在 PC 端浏本文~

背景

  1. OceanBase 3.X 企业版 MySQL 模式
  2. 某客户在性能压测过程中反馈,在对某张表 UPDATE 时响应缓慢,一直无法执行成功。
  3. gv$sql_aduit 关于此 SQL 相关信息已被清理,且 Top SQL 未提示报错具体原因,只能基于日志文件进行排查。
  4. OCP 云平台查看初始状态如下:

  1. 文中后半部分对此场景进行延伸。
  • 假设 SQL 正处于异常重试状态中,且关联的 gv$sql_audit 视图信息未被清除的情况下,如何展开排查提供思路。

排查过程

1. 导出 Top SQL

列管理 按需勾选需查看的信息(如:SQL ID,重试次数)。

2. 复制 SQL 文本

3. 查找 UPDATE 语句

在对应的服务器上 grep 此 SQL 语句的打印次数:

  • 结果为 1 小时内执行了 505 次,判断针对该行数据的 UPDATE 行为可能存在异常。
  • 日志打印 SQL 次数可能与 Top SQL 不同,大致对应上即可。
  • 一般异常 SQL 会在 observer.log 中打印,正常执行完成的可能不会存在记录。
# grep -i "UPDATE evan.evan_zheng SET name = 'test0409' WHERE id = 1" observer.log.2024040916* | wc -l
505

4. 查找错误位置

以 SQL 语句 和 ret= 作为条件进行检索,看是否存在相关错误码。

  • 若 SQL 文本无法精准匹配,则只复制部分关键字。
  • 可以看到 40126003 等超时相关错误码。
  • 复制一条 trace id 用于检索
# grep -i "UPDATE evan.evan_zheng SET name = 'test0409' WHERE id = 1" observer.log.2024040916* | grep "ret="

5. 查看报错信息

检索 trace_id,查看主要报错信息。

  • 写写冲突:on_wlock_retry、lock_for_write conflict
  • 错误码:6005
  • 更新某行数据失败:failed to update row (xxx)

6. 写写冲突部分日志

#  grep -i "YB420ABA40A1-000615A29EDEEA36-0-0" observer.log.2024040916* | grep "lock_for_write conflict"

点击放大

7. 确认行为

确认此 trace_id 关联的 SQL 存在重试行为。

# grep -i "YB420ABA40A1-000615A29EDEEA36-0-0" observer.log.2024040916* | grep -i "will retry"

8. 错误码含义

错误码 6005:更新操作加锁失败

错误码 6003:等待锁超时

错误码 6212:SQL 语句超时

对于语句超时的情况,首先要确定当前租户下 ob_query_timeout 变量设置,然后根据 trace_id 搜索 observer.log 日志,找到当前语句的 cur_query_start_time

如果 超时时间点 - cur_query_start_time = ob_query_timeout,说明是符合预期的。下面来验证一下。

  1. 查询租户变量 ob_query_timeout 为 10s。

  1. 在 observer.log 中检索此 trace_id 的起始时间。

开始时间:

# grep -i "YB420ABA40A1-000615A29EDEEA36-0-0" observer.log.20240409* | grep -m 1 "cur_query_start_time"

超时时间:

# grep -i "YB420ABA40A1-000615A29EDEEA36-0-0" observer.log.20240409* | grep "timeout_timestamp" | tail -n 1

可以看到超时时间减去开始时间等于 10s,说明此处超时行为符合预期。

问题总结

当执行 SQL UPDATE evan.evan_zheng SET name = 'test0409' WHERE id = 1; 更新操作加锁失败,达到当前租户 ob_query_timeout 变量设置的值(10s)触发 6212 报错(语句超时)回滚语句。

可能造成此问题的原因:

  1. 业务使用了较大的超时时间,且存在一个会话中的未知长事务持有锁,阻塞了其他事务的执行。
  2. 开发人员并发更新同一行数据,并发处理逻辑存在错误。

优化措施

  1. 合理设置超时变量时间。
  2. 合理设置程序代码并发控制逻辑。
  3. 关注长事务告警。

延伸场景

如果 SQL 正在持续重试中,且 gv$sql_audit 视图信息未被清除,可参考如下步骤进行排查。

1. OCP 云平台,复制 SQL ID

2. 基于 SQL ID 查看主要的错误代码

可以看到 40126003 等超时相关错误码。

select
  /*+ PARALLEL(8)*/
  trace_id,
  sid,
  tenant_name,
  svr_ip,
  svr_port,
  retry_cnt,
  ret_code,
  query_sql,
  usec_to_time(request_time) as start_time
from
  gv$sql_audit
where
  sql_id = 'D884EA797E73F466819BAE2AE4AC1FE1'
  and retry_cnt > 1
group by
  ret_code
order by
  retry_cnt desc;

3. 查看 session_id

select
  /*+ PARALLEL(8)*/
  trace_id,
  sid,
  tenant_name,
  svr_ip,
  svr_port,
  retry_cnt,
  ret_code,
  query_sql,
  usec_to_time(request_time) as start_time
from
  gv$sql_audit
where
  sql_id = 'D884EA797E73F466819BAE2AE4AC1FE1'
group by
  sid
order by
  request_time desc;

4. 查询 table_id

select
  database_name,
  table_id,
  table_name,
  tenant_id,
  tenant_name
from
  oceanbase.gv$table
where
  tenant_id = 1001
  and database_name = 'evan'
  and table_name = 'evan_zheng';

5. 查询锁持有者事务信息

使用 sys 租户执行。

select * from __all_virtual_trans_lock_stat where table_id = '1100611139453778'\G

6. 查询锁等待者事务信息

使用 sys 租户执行。

可以看到此处 session_id 与 gv$sql_audit 查询出来的是一致的(即,异常重试的 SQL 的会话)。

select * from __all_virtual_lock_wait_stat where table_id = '1100611139453778'\G

7. 查询锁持有者 session 的 SQL

select
  trace_id,
  usec_to_time(request_time),
  query_sql
from
  gv$sql_audit
where
  TENANT_ID = 1001
  AND USER_NAME = 'root'
  AND SID = '3221616444'
order by
  request_time desc;

8. 查看锁等待者 session 的 SQL

select
  trace_id,
  usec_to_time(request_time),
  query_sql
from
  gv$sql_audit
where
  TENANT_ID = 1001
  AND USER_NAME = 'root'
  AND SID = ' 3221618060'
order by
  request_time desc;

可以看到锁持有者的会话和锁等待者的会话都针对表 evan_zheng 中 id=1 的字段进行更新,由于锁持有者开启了手动提交且未进行提交导致锁等待者持续重试 UPDATE 操作。

9. KILL 锁持有者会话

解决方法:经确认风险后,kill 锁持有者会话。

进一步分析可参考前方步骤,结合 observer.log 等信息进行分析。

其他错误码

通过如下几个错误码可以判断 SQL 超时原因(语句超时/事务超时/事务空闲超时):

  • 系统变量 ob_query_timeout: 该变量控制着语句执行时间的上限,语句执行时间超过此值会给应用返回语句超时的错误,错误码为 6212,并回滚语句,通常该值默认为 10s。
  • 系统变量 ob_trx_timeout: 该变量控制着事务超时时间,事务执行时间超过此值会给应用返回事务超时的错误,错误码为 6210,此时需要应用发起 ROLLBACK 语句回滚该事务。
  • 系统变量 ob_trx_idle_timeout: 该变量表示 session上一个事务处于的 IDLE 状态的最长时间,即长时间没有 DML 语句或结束该事务。超过该时间值后,事务会自动回滚。再执行 DML 语句会给应用返回错误码 6224,应用需要发起 ROLLBACK 语句清理 session 状态。

参考资料-OceanBase官方知识库

  1. 《OceanBase 数据库日志解读示例》知识库:OceanBase 数据库日志解读示例
  2. 《OceanBase 数据库事务问题排查指南》OceanBase 数据库事务问题排查指南
  3. 《OceanBase 数据库中的行锁问题排查指南》OceanBase 数据库中的行锁问题排查指南
  4. 《事务控制概述》事务控制概述

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

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

相关文章

防泄密的方法都有哪些?

一、防泄密的方法都有哪些?使用安全通讯工具:采用加密通讯工具,确保敏感信息在传输过程中不被窃取或篡改。定期安全审计:对系统和数据进行定期的安全审计和检查,发现潜在的泄密风险并及时处理。文件加密:对…

光伏电站的施工步骤

施工准备:在施工前,需要进行现场勘查,了解施工场地的地形、地貌、气候等情况,制定施工方案和安全措施。同时,还需要准备好施工所需的材料和设备,如光伏组件、支架、电缆、逆变器等 。基础施工:根…

“面试宝典:高频算法题目详解与总结”

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

鸿蒙Harmony开发实战:自定义圆形组件-Canvas

在采用Java配合xml布局编写鸿蒙app页面的时候,发现sdk自带的Image组件并不能将图片设置成圆形,反复了翻阅了官方API手册(主要查阅了Compont和Image相关的API),起初发现了一个setCornerRadius方法,于是想着将…

高职院校人工智能训练师边缘计算实训室建设方案

一、引言 随着人工智能技术的飞速发展,边缘计算在提升数据处理效率、降低延迟、保护数据安全等方面展现出巨大潜力。高职院校作为技能型人才培养的重要基地,建设人工智能训练师边缘计算实训室,旨在培养掌握前沿技术、具备实战能力的复合型人才…

pnpm国内源设置

一、背景 在国内使用pnpm时,由于网络问题,经常会遇到速度慢或无法访问的问题。为了提高效率,可以将pnpm的源设置为国内的镜像源。以下是一些常用的国内pnpm镜像源以及如何设置它们的方法。 二、国内可用源 2.1 淘宝pnpm源 https://registry…

神经网络卷积层

一、卷积操作 对应位置相乘相加,最终组成一个新的矩阵,实现了降维。 二、代码 import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR10(&…

三级_网络技术_54_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写路由器RG的路由表项。 目的网络/掩码长度输出端口__________S0(直接连接)__________S1(直接连接)__________S0__________S1__________S0__________S1 2.如果将10.10.67.128/2…

C++----简单了解vector

大家好,今天我们来讲讲与string相似的向量类型。之所以说他们是相似的原因是他们其中的数据类型有些效果都是一样的。当然大家不能说,既然是差不多的干嘛还有一个这个啊。不如直接用string就可以了。当然世界名言存在即合理。既然我们都能想到的东西&…

Docker 部署 net6 webapi项目

摘要:记录 net6 webapi 项目在 docker 上部署步骤,方便自己后面查看,也方便他人学习。 1. 创建 webapi 项目 点击创建新项目 选择 ASP.NET Core Web API 项目,点击下一步。 给项目命名,然后勾选将解决方案和项目放在同…

C++初学(18)

18.1、读取数字的循环 假设要编写一个将一系列的数字读入到数组中的程序,并允许用户在数组填满之前结束输入。一种方法是利用cin: int n; cin>>n; 如果用户输入的是一个单词,而不是一个数字将会怎么样?可能会发生这些情况…

环境变量--永久 & 暂时

Linux 环境变量配置信息 查看环境变量 export 查看系统所有环境变量echo $PATH 查看 PATH 环境变量值 环境变量的命名规则为:变量名变量值 多个变量值之间使用 : 分隔 添加环境变量 环境变量分类 按照作用域分类 环境变量可以简单的分成用户自定义的环境变量…

OJ-0829

题目 示例1 输入: 5 4 1 1 2 3 5 1 2 3 1 4 3 4 5 2 3 4 输出: 3 4 1 2说明:测试用例的优先级计算如下: T1Pf1Pf2Pf31124 T2Pf1Pf4134 T3Pf3Pf4Pf523510 T4Pf2Pf3Pf41236 按照优先级从小到大,以及相同优先级,ID小的先执行的规则&…

#C++ 笔记三

七、异常处理 1.概念 异常是程序在执行期间产生的问题。 C异常是指在程序运行时发生的特殊情况,比如下标越界等。 异常提供了一种转移程序控制权的方式。 2.抛出异常 throw语句的操作数可以是任意表达式,表达式结果的类型决定了抛出异常的类型。 …

Elasticsearch Suggesters API详解与联想词自动补全应用

Elasticsearch Suggesters API详解与联想词自动补全应用 引言Elasticsearch Suggesters1. Term Suggester实现步骤示例 2. Phrase Suggester示例 3. Completion Suggester创建映射和插入数据查询示例 4. Context Suggester示例 Completion Suggester1. 工作原理2. 使用流程3. 使…

企业级低代码解决方案:JNPF平台深度解析

随着数字化转型的不断推进,企业对于快速开发、高效部署和灵活迭代的需求日益增长。低代码开发平台应运而生,成为加速企业应用开发的重要工具。在众多低代码平台中,JNPF凭借其强大的企业级特性脱颖而出,成为众多企业的首选。本文将…

【系统架构设计师-2019年】综合知识-答案及详解

文章目录 【第1题】【第2~3题】【第4题】【第5题】【第6~7题】【第8题】【第9~10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16~17题】【第18~19题】【第20~21题】【第22~23题】【第24~25题】【第26~28题】【第29~30题】【第31~32题】【第33题】【第34题】【第…

Java中三大容器类(List、Set、Map)详解

三大容器介绍 名称结构特点常见实现类List(列表)由有序的元素序列组成,可以包含重复元素可以通过索引访问元素,插入的顺序与遍历顺序一致ArrayList、LinkedList、VectorMap(映射)由键值对(Key-Value)组成的…

Axure 9 使用

一、界面初识 二、基础功能 1.菜单栏 1.1文件 新建文件:axure9包含四种文件.rp代表原型文件,.rplib代表元件库文件,.rpteam 团队项目文件 .html 网页文件 偏好设置:备份,需要备份文件再从备份中恢复 创建项目团…

GPT-SoVITS:零样本语音合成AI

GPT-SoVITS 是一种语音合成模型,于 2024 年 2 月 18 日发布。它支持使用参考音频进行零样本语音合成,并且可以进行微调以提高性能。 GPT-SoVITS 的功能特性包括: Zero-Shot TTS:零样本语音合成,输入 5 秒音频样本即可…