如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14
1. 背景
卡合并在OceanBase中是一个复杂的问题,其产生可能源于多种因素。目前,对于卡合并的明确界定尚不存在统一标准,一方面,我们界定超过36小时未完成合并为合并超时,此时RS会记录ERROR日志;另一方面,用户也可能依据自身经验来判断合并是否超时。当用户怀疑合并可能已超时,可利用巡检工具进行检查,以确认是否存在问题,并且得到一系列基础数据方便研发做一个初步的判断,省去一些反复沟通的时间。本文描述了 OceanBase 4.x 版本基于obdiag,如何进行卡合并的分析和诊断。
2. 卡合并诊断流程说明
2.1. 发现卡合并问题
巡检认为合并/转储存在潜在问题可以有三点:
- CDB_OB_MAJOR_COMPACTION里IS_ERROR=YES
- 其中当CDB_OB_MAJOR_COMPACTION里IS_SUSPENT=YES,可以提示用户,用户可能是有意设置也有可能是无意设置
- __all_virtual_compaction_diagnose_info里存在status=FAILED的记录
- GV$OB_COMPACTION_PROGRESS表中,根据上一次合并记录中的data_size/(estimated_finish_time-start_time)与当前合并版本记录中(data_size-unfinished_data_size)/(当前时间-start_time)相比,如果差距过大(当前合并比上一次合并慢很多,以5倍为指标),那可能可以认为合并存在异常
2.2. 卡合并诊断
2.2.1. 确定合并记录
查询CDB_OB_MAJOR_COMPACTION,找到status=COMPACTING的记录(需要收集回来)
-
- 可以先检查一下IS_ERROR和IS_SUSPENDED是否非NO,IS_ERROR通常发生在出现数据不一致的时候,INFO里会显示具体问题;IS_SUSPENDED表示暂停了合并,有时候会忘了执行过暂停合并操作,需要手动恢复合并(
ALTER SYSTEM RESUME MERGE;)
- 可以先检查一下IS_ERROR和IS_SUSPENDED是否非NO,IS_ERROR通常发生在出现数据不一致的时候,INFO里会显示具体问题;IS_SUSPENDED表示暂停了合并,有时候会忘了执行过暂停合并操作,需要手动恢复合并(

- 查询__all_virtual_compaction_diagnose_info,最好根据上面得到的结果,每个租户查一次,方便看(需要收集回来)。
- 如果有记录,根据DIAGNOSE_INFO字段的内容来具体分析。这里只介绍了一部分常见的信息,其他的目前还是考虑先把诊断表结果拿回来,我分析后再手动进行下一步:
- schedule medium failed
- 查找这台机器上,CREATE_TIME附近时间的observer.log,grep "decide_medium_snapshot",捞到信息后,把线程号摘出来,更换过滤关键字grep "\[线程号]",收集decide_medium_snapshot关键字前后20行的日志。通常里面会有报错上下文
- %error_no=%error_trace=%
- 这种情况通常有dag任务失败了,首先查__all_virtual_tablet_meta_table,看下这个分区的compaction_scn是否小于合并版本(global_broadcast_scn),如果小于再进行步骤2
- 在对应机器的对应时间附近,grep "error_trace",收集这部分日志回来,整个trace的日志通常不会很多,尽可能捞到报错前后的日志。
- schedule medium failed
不影响正常流程的错误码!!!
constexpr int OB_NO_NEED_MERGE = -4677; // 调度的时候发现可以做Compaction,实际执行时发现不满足Compaction要求
constexpr int OB_CANCELED = -4072; // dag任务被cancel掉,上层逻辑停止了compaction任务
如果是scheduler报错4072,怀疑是执行了suspend merge,需要resume merge--4.0版本--
constexpr int OB_TABLE_IS_DELETED = -4279; // 表被删除
constexpr int OB_TENANT_HAS_BEEN_DROPPED = -5685; //租户被删
constexpr int OB_LS_NOT_EXIST = -4719; // 日志流不存在
constexpr int OB_TABLET_NOT_EXIST = -4725; //表被删比较危险的错误
constexpr int OB_CHECKSUM_ERROR = -4103; // 数据checksum报错
constexpr int OB_ROWKEY_ORDER_ERROR = -4105; // rowkey乱序
constexpr int OB_PHYSIC_CHECKSUM_ERROR = -4108; // 物理checksum问题,多发现于物理盘有问题
constexpr int OB_CS_OUTOF_DISK_SPACE = -4184; // datafile中没有空闲宏块时报错,表示集群写的数据达到上限。需要扩展存储空间
3. weak read ts is not ready
-
-
- 查询对应租户和ls_id的__all_virtual_ls_info结果(收集)
- 过滤出weak_read_scn比合并版本(global_broadcast_scn)小的记录,到相应机器上在最新几个observer日志里grep "weak_read_scn+1的值"、"generate_weak_read_timestamp_"以及"log disk space is almost full"(收集)
- 如何进一步判断可以咨询日志或事务组同学
-
4. memtable can not create dag successfully
-
-
- 首先查__all_virtual_tablet_meta_table,看下这个分区的compaction_scn是否小于合并版本(global_broadcast_scn),如果小于再进行ii
- 查询这台机器这个租户的__all_virtual_dag_scheduler(收集回来)
-
5. medium wait for freeze或者major wait for freeze
-
-
- 查询这台机器这个租户的__all_virtual_dag_scheduler(收集回来)
-
6. major not schedule for long time
-
-
- 查询该分区的__all_virtual_tablet_compaction_info(收集回来)
- 到该机器observer.log 查找grep "MediumLoo" | grep T租户id,然后摘出线程号,更换关键词grep "\[线程号]",在最新日志里收集1000行日志
-
3. 查询GV$OB_COMPACTION_PROGRESS,指定租户和compaction_scn,分别查compaction_scn=当前合并版本global_broadcast_scn以及compaction_scn=上一个合并版本(last_scn)的记录(收集回来)
-
- 如果当前版本的所有记录status都是FINISH,那么查询CDB_OB_LS_LOCATIONS,查到租户ls_id=1的leader机器,到该机器上查找最新的几个rootservice.log,grep "major_merge_progress_checker" | grep Txxxx,将日志收集回来
- 根据上一次合并记录中的data_size/(estimated_finish_time-start_time)与当前合并版本记录中unfinished_data_size/当前时间-start_time相比,如果差距过大(当前合并比上一次合并慢很多),那可能可以认为合并存在异常
4. 查询GV$OB_COMPACTION_SUGGESTIONS,把结果收集回来
5. 查询oceanbase.__all_virtual_dag_warning_history,收集status="RETRYED",type like "%MERGE%"的结果。并收集gmt_create附近时间点的observer日志,过滤task_id。
4. 如何借助obdiag来快速处理卡合并问题
目前阶段卡合并场景主要用于初步的分析定位及有效信息收集,需要在完成后将收集的有效信息进行打包并上传社区 问答区或 OceanBase 运维进行进一步分析。
obdiag rca run --scene=major_hold
案例参考:OB社区版4.2.1 1T数据量10G以下数据增量 每日合并时间20小时左右 如何优化
4. 后续场景升级
目前实现仅作为排查的信息收集对于底层的分析未实现,后续将逐步进行深入的根因分析
有兴趣的DBA和开发者可以加入obdiag SIG进行共建开发。
5. 技术支持
排查思路及流程感谢 镜水(胡皓胜) 提供。
附录
•obdiag 下载地址: https://www.oceanbase.com/softwarecenter
•obdiag 官方文档: https://www.oceanbase.com/docs/obdiag-cn
•obdiag github地址: GitHub - oceanbase/obdiag: obdiag (OceanBase Diagnostic Tool) is designed to help OceanBase users quickly gather necessary information and analyze the root cause of the problem.
•obdiag SIG 营地: [obdiag SIG] 诊断工具组 · OceanBase 技术交流
相关文章:
如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14
1. 背景 卡合并在OceanBase中是一个复杂的问题,其产生可能源于多种因素。目前,对于卡合并的明确界定尚不存在统一标准,一方面,我们界定超过36小时未完成合并为合并超时,此时RS会记录ERROR日志;另一方面&am…...
hackme靶机渗透流程
一,搭建环境 本次测试使用hackme的靶机 攻击为kali(192.168.30.130)与物理机 二,信息收集 1.确定IP 先确定mac信息,再搭配主机扫描确定靶机的IP地址 00:0C:29:D0:F5:74 确定靶机地址为 192.168.30.133 2.扫描靶机…...
uniapp 常用的地区行业各种多选多选,支持回显,复制粘贴可使用
uniapp 常用的地区行业各种多选多选,支持回显 必须导入uni-popup 弹出层 该组件 1.目前项目开发中使用到这类似挺多的,记录一下,方便以后是使用 2.使用前提,目前不做无限级,只支持二维数组,模板里只循环了两…...
iOS 本地存储地址(位置)
前言: UserDefaults 存在沙盒的 Library --> Preferences--> .plist文件 CoreData 存在沙盒的 Library --> Application Support--> xx.sqlite 一个小型数据库里 (注:Application Support 这个文件夹已开始是没有的,只有当你写了存储代码,运行之后,目录里才会出…...
uni.showLoading 时禁止点击(防止表单重复提交) 小程序调取微信支付
在使用 uni.showLoading 时,如果需要禁用点击事件,可以在调用 uni.showLoading 之前设置全局的触摸事件为禁用状态,然后在 uni.hideLoading 之后再重新启用。 mask 选项是 uni.showLoading 的一个参数,当设置为 true 时,会显示遮罩,此时用户不能点击底层的任何内容。 // …...
OpenClash与Tailscale冲突得问题
1.问题描述:开了openclash之后,tailscale就用不了。tailscale ping XXX.XXX.XXX.XXX 可以成功。但是用cmd的ping就不通。 2.tailscale登录得时候,加上这两个参数:--accept-dnsfalse 和 --netfilter-modeoff 。 示例:t…...
day02|计算机网络重难点之HTTP请求报文和响应报文
day02|计算机网络重难点之HTTP请求报文和响应报文 3.HTTP请求报文和响应报文是怎样的,有哪些常见的字段? 3.HTTP请求报文和响应报文是怎样的,有哪些常见的字段? HTTP请求报文主要是由 请求行、请求头部、空行和请求体 四部分组成…...
Flutter之build 方法详解
前言 我们创建一个Flutter程序,入口文件内容如下 //导包,此行代码作用是导入了 Material UI 组件库。Material (opens new window)是一种标准的移动端和 web 端的视觉设计语言, Flutter默认提供了一套丰富的 Material 风格的 UI 组件。 impo…...
开源呼叫中心系统与商业软件的对比
开源呼叫中心系统与商业软件的对比 作者:FreeIPCC 在当今的商业环境中,呼叫中心系统已成为企业与客户之间沟通的重要桥梁。而在选择呼叫中心系统时,企业面临着两种主要的选择:开源呼叫中心系统和商业软件。这两种系统各有其独特的…...
【人工智能】——matplotlib教程
文章目录 1.matplotlib简介2.基本绘图功能2.1给图形添加辅助功能2.2在一个坐标系中绘制多个图像2.3多个坐标系显示图像 3.常见图像绘制 1.matplotlib简介 matplotlib 是一个用于创建二维图表和数据可视化的 Python 库,它提供了一种类似于 MATLAB 的绘图接口。matplo…...
【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试
【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹,使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…...
使用Angular构建动态Web应用
💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用Angular构建动态Web应用 1 引言 2 Angular简介 3 安装Angular CLI 4 创建Angular项目 5 设计应用结构 6 创建组件…...
25届电信保研经验贴(自动化所)
个人背景 学校:中九 专业:电子信息工程 加权:92.89 绩点:3.91/4.0 rank:前五学期rank2/95,综合排名rank1(前六学期和综合排名出的晚,实际上只用到了前五学期) 科研…...
大数据-190 Elasticsearch - ELK 日志分析实战 - 配置启动 Filebeat Logstash
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
不同类型的 LED 驱动电源在检测方法上有哪些不同?-纳米软件
1.传统 LED 驱动电源检测方法: 通常会提取 LED 驱动电源性能指标参数中较为重要的几个因子,如电压稳定性、电流波动范围等。利用诸如 k-means 聚类分析方法,实现对不同厂家、使用寿命不同的 LED 驱动电源快速有效的分类2。这种方法主要是通过…...
android 生成json 文件
在做网络请求的时候需要生成一个如下的json文件: {"messages": [{"role": "user","content": [{"type": "image_base64","image_base64": "pp"},{"type": "text&…...
C++新增的类功能和可变参数模板
C新增的类功能和可变参数模板 新的类功能默认成员函数 可变参数模板模拟实现emplace_back 🌏个人博客主页: 个人主页 新的类功能 默认成员函数 原来C类中,有6个默认成员函数: 构造函数析构函数拷贝构造函数拷贝赋值重载取地址…...
redo log 日志 与 undo log 日志工作原理
目录标题 1. redo log 日志2. undo log 日志3.总结 1. redo log 日志 redo log日志是 MySQL 数据中的重要日志之一,其本质是物理日志,存放于 数据库的数据目录中 ,名称为: ib_logfile 。它的功能主要是用于存放脏数据的日志&…...
go语言结构体与json数据相互转换
本博文简要介绍go语言结构体如何与json格式化字符串相互转换。 文章目录 go语言结构体转换为json数据json数据转换为go结构体 go语言结构体转换为json数据 type Person struct {Name string json:"name"Age int json:"age"Hobbies []strin…...
jenkins 自动化部署Springboot 项目
一、安装docker 1.更新yum命令 yum -y update2.查看机器有残留的docker服务,有就卸载干净 查看docker 服务 rpm -qa |grep docker卸载docker sudo yum remove docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/contai…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
