与中国联通技术共建:通过obdiag分析OceanBase DDL中的报错场景
中国联通软件研究院(简称联通软研院)在全面评估与广泛调研后,在 2021年底决定采用OceanBase 作为基础,自研分布式数据库产品CUDB(即China Unicom Database,中国联通数据库)。目前,该分布式CUDB已在中国联通的338多个项目中顺利实施,助力完成了85TB的应用数据迁移,使慢SQL查询数量减少了43%,同时数据库运维效率的人均提升达到了20%。
为完善产品能力,支撑中国联通个性化的业务需求,联通软研院与OceanBase社区在数据库的内核和外围工具层面展开共建,比如事务日志解析LogMiner、敏捷诊断工具obdiag 等功能的深度共建,以及实现多个核心功能的研发,修复多个OceanBase内核BUG。其中,对于LogMiner的共建历程与经验已发文分享,本文主要分享obdiag共建的技术背景、设计思路、实现细节及其带来的价值。
一、分布式CUDB演进历程
四年前,中国联通基于内部数据库系统的痛点与外部100%自研要求的背景,启动全栈分布式数据库建设。从替代高危 MySQL、降低商用依赖,以及提升中国联通软研院软实力等多方面考虑,选定基于国内开源分布式数据库产品OceanBase打造自研数据库产品分布式CUDB(详情见生产系统稳定上线600天 ——中国联通分布式 CUDB 的开源共建和规模化应用)。

对于分布式 CUDB 的演进历程,简言之,联通软研院在引进OceanBase的第一年着重于产品化建设。实现产品的一键开通、弹性扩缩、高效迁移,并且开始试点推广应用。2023年开始对接监控运维体系,并且开始大规模推广使用。重点聚焦数据库产品生态工具方面的补齐和人员能力的提升,为替代 MySQL 和新上应用提供全栈国产的数据库资源及服务能力。
虽然联通软研院做了很多产品能力建设,如高效的数据迁移、异地容灾高可用、完善的数据库自治服务、智能预测与诊断自愈,形成了相对完善的产品体系。但仍面临诸多挑战,比如现有功能不完全满足联通的个性化需求,再比如运维人员对数据库内核和源码的掌控不足,导致处理集群问题时非常棘手。
因此,在2024年,联通软研院推动智能化运维,着手智能运维建设。其中,为进一步提高自动化运维诊断效率,联通软研院与OceanBase携手合作,在OceanBase敏捷诊断工具obdiag的基础上进行深度共建,并深入内核研究,共同研发了一项全新的功能——建索引报错的根因分析功能。
二、敏捷诊断工具obdiag共建背景
OceanBase是原生分布式数据库系统,故障根因分析通常是比较繁琐的,涉及的因素可能有很多,如机器环境、配置参数、运行负载等。专家在排查问题的时候需要获取大量的信息来分析故障。
那么,如何高效地获取故障场景下分散在各个节点的信息,挖掘其中的关联性,帮助用户自助诊断问题呢?
在引入obdiag前,每当遇到OceanBase数据库系统的复杂故障时,用户往往求助于原厂的专业团队。这不仅是因为故障排查涉及大量分布在不同节点上的信息,而且收集和整理这些信息缺乏统一的工具,再加上与专家反复沟通确认细节的过程,使整个故障解决周期变得漫长且充满变数。

拥有obdiag这一敏捷诊断工具后,通过obdiag的一键集群巡检、一键诊断分析、一键信息收集及一键根因分析功能,大大简化了故障排查的交互过程。即便是经验相对不足的技术人员也能够快速地识别出潜在问题,并根据诊断结果采取相应的措施,提升了故障排查工作的效率。
然而,obdiag现有的功能并不能满足联通软研院的故障排查需求。众所周知,在数据库运维中,DDL(Data Definition Language)操作是常见且重要的组成部分,其中包括创建、删除或修改数据库对象,比如表、索引等。但在实际生产环境中,DDL操作可能会因为各种原因失败,比如资源不足、并发冲突等,这会给业务带来不必要的中断和损失。为了解决这个问题,联通软研院基于obdiag框架进行了扩展,设计并实现了新的根因分析功能——建索引报错的根因分析。该功能能够在建索引失败时,像专家一样分析建索引失败的原因,给出分析报告。
三、建索引报错的根因分析
建索引报错的日志分析的基本思路是根据建索引的基本步骤,判断建索引失败在哪一步,然后决策收集哪些机器的日志。排查思路如下图所示。

排查共8个步骤。
第1步:租户名、数据库名、表名、创建索引失败的索引名字,作为输入参数。
第2步:根据入参,获取对应的tenant_id、database_id、table_id。
# 获取租户idselect tenant_id from __all_tenant where tenant_name = '租户名';# 获取数据库idselect database_id from __all_database where database_name='数据库名';# 获取表idselect table_id from __all_virtual_table where table_name = '表名' and tenant_id = '租户id' and database_id='数据库id';
第3步:根据索引名,获取索引表id。
# 获取索引表idselect table_id from __all_virtual_table_history where tenant_id = '租户id' and data_table_id = '数据库id' and table_name like '%索引名%';
第4步:根据索引表ID,查询__all_virtual_ddl_error_message表格中是否有记录。
# 获取task_id、trace_idselect task_id ,trace_id from __all_virtual_ddl_error_message where tenant_id = '租户id' and object_id = '索引表id';
如果无记录,那说明失败在发送RPC,打印出信息,提示此时需要人工接入排查,否则进入步骤5
第5步:根据task_id,查询__all_rootservice_event_history表。
# 查询__all_rootservice_event_history表select event, value6,rs_svr_ip, rs_svr_port from __all_rootservice_event_history where value4 = 'task_id' and value2 != 0 and event != 'switch_state' and event not like 'index build task process fail' order by gmt_create desc limit 1;
如果event字段的值为是ddl wait trans end ctx try_wait,那么进入第6步,如果是 index sstable build task finish,那么进入第7步,如果是其他的步骤,那么进入第8步。
第6步:event的名字为ddl wait trans end ctx try_wait,那么根据trace_id,去捞主表所有的tablet所在leader节点的日志。
第7步:event的名字为 index sstable build task finish,根据trace_id去捞取observer的日志。
第8步:event既不是ddl wait trans end ctx try_wait,也不是index sstable build task finish,此时需要根据trace_id去捞取rootservice.log.。
目前obdiag支持了增加索引时报错诊断场景,该支持适用于OceanBase 4.2.3 版本及OceanBase 4.3版本以上。
obdiag rca run --scene=index_ddl_error --input_parameters='{"tenant_name":"cudb_test","table_name":"test1245","database_name":"test","index_name":"idx_name"}' -c obce423config.yml
input_patameters是一个用于输入不同根因分析场景下需要引入的变量赋值,输入对象的应该为一个json格式的字符串用于解析。
tenant_name:租户名table_name:表名database_name:库名index_name:索引名
示例:如下为一次调用的结果record的展示。

总结
联通软研院与OceanBase的合作不仅是技术上的交流,更是对未来发展趋势的一种探索。通过共建obdiag的新功能,双方旨在达成四个目标。
· 提升运维效率:通过自动化的故障诊断,减少人工介入的时间成本,提升整体运维效率。
· 增强系统稳定性:及时发现并解决问题,提高数据库系统的稳定性和可靠性。
· 促进技术创新:借助双方的技术积累,共同探索数据库领域的前沿技术,推动技术创新。
· 增强用户体验:为用户提供更可靠、更高效的数据库服务,提高用户满意度。
在此过程中,特别感谢OceanBase谢振江(花名:仓氐)提供的排查思路及流程,以及中国联通软件研究院靖永栋提供根因分析场景编码实现。
附录
OceanBase GitHub仓库: GitHub - oceanbase/oceanbase: OceanBase is an enterprise distributed relational database with high availability, high performance, horizontal scalability, and compatibility with SQL standards.
感兴趣的DBA和开发者可以加入obdiag SIG进行共建开发。
•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 DDL中的报错场景
中国联通软件研究院(简称联通软研院)在全面评估与广泛调研后,在 2021年底决定采用OceanBase 作为基础,自研分布式数据库产品CUDB(即China Unicom Database,中国联通数据库)。目前,该…...
IDEA 接入 Deepseek
在本篇文章中,我们将详细介绍如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek,让你的 AI 编程助手更智能,提高开发效率。 一、前置准备 在开始之前,请确保你已经具备以下条件: 安装了 JetBrains IDEA&…...
斗地主小游戏
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>斗地主</title><style>.game-container {width: 1000px;height: 700px;margin: 0 auto;position: relative;background: #35654d;border-radius: 10px;padding…...
如何改变怂怂懦弱的气质(2)
你是否曾经因为害怕失败而逃避选择?是否因为不敢拒绝别人而让自己陷入困境?是否因为过于友善而被人轻视?如果你也曾为这些问题困扰,那么今天的博客就是为你准备的。我们将从行动、拒绝、自我认知、实力提升等多个角度,…...
C# OnnxRuntime部署DAMO-YOLO人头检测
目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…...
基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践
目录 前言 一、原来的生成方案问题 1、无法自动读取数据的Bounds 2、专题图高宽比例不协调 二、专题图生成优化 1、直接读取矢量数据的Bounds 2、专题图成果抗锯齿 3、专题成果高宽比例自动调节 三、总结 前言 在当今数字化浪潮中,地理信息系统(…...
各种DCC软件使用Datasmith导入UE教程
3Dmax: 先安装插件 https://www.unrealengine.com/zh-CN/datasmith/plugins 左上角导出即可 虚幻中勾选3个插件,重启引擎 左上角选择文件导入即可 Blender导入Datasmith进UE 需要两个插件, 文章最下方链接进去下载安装即可 一样的,直接导出,然后UE导入即可 C4D 直接保存成…...
尚硅谷爬虫note15
一、当当网 1. 保存数据 数据交给pipelines保存 items中的类名: DemoNddwItem class DemoNddwItem(scrapy.Item): 变量名 类名() book DemoNddwItem(src src, name name, price price)导入: from 项目名.items import 类…...
云原生系列之本地k8s环境搭建
前置条件 Windows 11 家庭中文版,版本号 23H2 云原生环境搭建 操作系统启用wsl(windows subsystem for linux) 开启wsl功能,如下图 安装并开启github加速器 FastGithub 2.1 下载地址:点击下载 2.2 解压安装文件fastgithub_win-x64.zip 2…...
关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题
如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入: <meta charset"UTF-8"> 以jsp为例子,我们…...
mysql foreign_key_checks
foreign_key_checks是一个用于设置是否在DML/DDL操作中检查外键约束的系统变量。该变量默认启用,通常在正常操作期间启用以强制执行参照完整性。 功能描述 foreign_key_checks用于控制是否在DML(数据操纵语言)和DDL(数据定义…...
开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念
一.前后端联调 我们首先来思考一个问题 前端的请求地址是:http://localhost/api/employee/login 后端的接口地址是:http://localhost:8080/admin/employee/login 明明请求地址和接口地址不同,那么前端是如何请求到后端接口所响应回来的数…...
REST API前端请求和后端接收
1、get请求,带"?" http://localhost:8080/api/aop/getResult?param123 GetMapping("getResult")public ResponseEntity<String> getResult(RequestParam("param") String param){return new ResponseEntity<>("12…...
道可云人工智能每日资讯|《奇遇三星堆》VR沉浸探索展(淮安站)开展
道可云元宇宙每日简报(2025年3月5日)讯,今日元宇宙新鲜事有: 《奇遇三星堆》VR沉浸探索展(淮安站)开展 近日,《奇遇三星堆》VR沉浸探索展(淮安站)开展。该展将三星堆文…...
服务器数据恢复—raid5阵列中硬盘掉线导致上层应用不可用的数据恢复案例
服务器数据恢复环境&故障: 某公司一台服务器,服务器上有一组由8块硬盘组建的raid5磁盘阵列。 磁盘阵列中2块硬盘的指示灯显示异常,其他硬盘指示灯显示正常。上层应用不可用。 服务器数据恢复过程: 1、将服务器中所有硬盘编号…...
【Pandas】pandas Series swaplevel
Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…...
esp32s3聊天机器人(二)
继续上文,硬件软件准备齐全,介绍一下主要用到的库 sherpa-onnx 开源的,语音转文本、文本转语音、说话人分类和 VAD,关键是支持C#开发 OllamaSharp 用于连接ollama,如其名C#开发 虽然离可玩还有一段距离࿰…...
pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码
PySide6的QtCharts类支持绘制各种型状的图表,如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等,下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果,实际使用时参照代码中示例数据的格式将实际数据替换即可…...
DVI分配器2进4出,2进8出,2进16出,120HZ
DVI(Digital Visual Interface)分配器GEFFEN/HDD系列是一种设备,它能够将一个DVI信号源的内容复制到多个显示设备上。根据您提供的信息,这里我们关注的是具有2个输入端口和多个(4个、8个或16个)输出端口的D…...
迷你世界脚本文字板接口:Graphics
文字板接口:Graphics 彼得兔 更新时间: 2024-08-27 11:12:18 具体函数名及描述如下: 序号 函数名 函数描述 1 makeGraphicsText(...) 创建文字板信息 2 makeflotageText(...) 创建漂浮文字信息 3 makeGraphicsProgress(...) 创建进度条信息…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
