从MySQL到OceanBase离线数据迁移的实践
本文作者:玉璁,OceanBase 生态产品技术专家。工作十余年,一直在基础架构与中间件领域从事研发工作。现负责OceanBase离线导数产品工具的研发工作,致力于为 OceanBase 建设一套完善的生态工具体系。
背景介绍
在互联网与云数据库技术的蓬勃发展下,MySQL已在全球范围内被大规模使用。当前,也有很多用户开始体验与MySQL高度兼容的分布式数据库OceanBase。面对从MySQL向OceanBase的迁移,很多小体量的业务常通常依赖MySQL生态中的轻量级工具进行逻辑备份与数据导入导出。
为了让用户更轻便快捷的进行迁移,OceanBase官方推出了多款专用的迁移工具,如OMS、DataX开源版及OBLOADER等,以在让用户能够沿用现有系统设计方案,顺利完成数据库迁移。本文是以在离线导数方案来教大家使用 mysqldump 和 OBLOADER 完成一次数据库迁移的实践。同时,在文末作者也会简单分享 OBLOADER 为了兼容 mysqldump 导出的文件格式的实现原理。
工具推荐
这一节我们会关注两个自研的生态工具:mysqldump 和 OBLOADER。mysqldump 作为 MySQL社区免费的导数工具,也常被用作MySQL逻辑备份程序。外部有不少用户的数据库运维系统也会集成mysqldump程序实现备份恢复功能。无论是导入导出还是备份恢复,日常的操作都是出库和入库。首先我们介绍一下 MySQL 官方的介绍:
提示:
1. mysqldump 支持导出 SQL-format, Delimited-text 文件格式;
2. SELECT ... INTO OUTFILE 仅支持导出 Delimited-text 文件格式;
3. SQL-format 文件格式可以使用 mysql 客户端导入;
4. Delimited-text 文件格式使用 LOAD DATA 或者 mysqlimport 客户端;
上述是我在阅读 MySQL 官方文档时提取出来与本文联系较大的内容。OBLOADER 需要能够正确识别 mysqldump 导出的文件。另外还要求用户熟练掌握 mysqldump 工具,这样整个实践的过程才会更加顺畅。数据库导出包括Schema定义导出和表中的数据导出两部分内容。Schema导出只能使用 SQL-format格式,但是数据导出会更加灵活,mysqldump 同时支持 SQL-format 文件格式和 Delimited-text 文件格式。那么,用户何时使用 SQL-format 文件格式,何时使用 Delimtied-text 文件格式呢?表中定义有二进制数据类型,例如:BIT, BINARY, VARBINARY, BLOB 以及BINARY字符集的字符类型时,表中的数据必须按照 SQL-format 文件格式导出,同时命令行加上 --hex-blob 选项,该选项可以控制 mysqldump 对二进制数据进行十六进制编码处理。注意:按照 Delimited-text 文件格式导出数据时,mysqldump 是无法使用 --hex-blob 选项。表中没有定义二进制数据类型时,强烈建议使用 Delimited-text 文件格式。下面我们结合MySQL导出和OceanBase导入操作来介绍工具的简单用法:
MySQL CE 导出数据示例
SQL-format 格式导出示例(不推荐)
mysqldump -h'127.0.0.1' -P 3306 -uroot -p'xxx' --databases 'test' --compact --complete-insert --disable-keys --hex-blob > test-data.sql S
说明:该示例是将数据库中定义的Schema信息和表数据按照SQL-format格式写进同一份文件中。
示例中的关键选项说明
选项 | 说明 |
---|---|
--compact | 导出产生更少用于调试的输出信息,例如:去掉注释和头尾等结构信息。 |
--complete-insert | 导出的 Insert SQL 语句会带上列名。例如:INSERT INTO <table> (column1, [column2...]) ... |
--disable-keys | 为了提升导入性能,导出的 Insert SQL 语句前后加上开关延迟构建索引。 |
--hex-blob | 对于二进制数据类型采用16进制字符串进行编码。 |
--skip-extended-insert | 导出的 Insert SQL 语句是单行插入语句,为了提升导入性能默认导出的是 Multi-values 格式。 |
--net-buffer-length | 默认值是1MB,最大值是16MB。该选项可以限制 Insert SQL 语句的长度。 |
提示:为了降低文件的存储空间,导出时可以加上一些命令行选项减少非必需的信息输出。
Delimited-text 格式导出示例(推荐)
mysqldump -h'127.0.0.1' -P 3306 -uroot -p'xxx' --databases test --compact --fields-optionally-enclosed-by "'" --fields-escaped-by '\\' --fields-terminated-by ',' --lines-terminated-by '\n' --tab='/var/tmp/';
说明:该示例将数据库中定义的Schema和表数据分开导出,Schema是按照SQL-format格式输出,数据是按照标准的 CSV 格式输出,CSV规范可参考 RFC-4180。
示例中的关键选项说明
选项 | 说明 |
---|---|
--compact | 导出产生更少用于调试的输出信息,例如:去掉注释和头尾等结构信息。 |
--fields-optionally-enclosed-by "'" | 指定列定界符。示例指定的是单引号。 |
--fields-escaped-by '\\' | 指定转义符。示例指定的是反斜杠。 |
--fields-terminated-by ',' | 指定列分隔符。示例指定的是逗号。 |
--lines-terminated-by '\n' | 指定行分隔符。示例指定的是 \n。注意:不同操作系统的换行符有差异。 |
--tab='/var/tmp/' | 指定Schema文件和数据文件的存放目录。 |
OceanBase 导入数据示例
本文是围绕着 OceanBase MySQL 模式来实践的,由于 MySQL 与 Oracle 之间存在差异,暂不涉及到 OceanBase Oracle 模式。基于上述的 MySQL 导出操作完成,我们使用 OceanBase 自研的客户端导入工具 OBLOADER 完成数据库导入操作。第一步是将数据库中定义的Schema导入到OceanBase中。
SQL-format 格式导入示例(不推荐)
./obloader -h'xxx.xxx.xxx' -P2883 -t'tenant' -c'cluster' -u'user' -p'xxx' --sys-password --mix -f '/var/tmp'
Delimited-text 格式导入示例(推荐)
./obloader -h'xxx.xxx.xxx' -P2883 -t'tenant' -c'cluster' -u'user' -p'xxx' --sys-password --csv -f '/var/tmp'
兼容性分析
在介绍解析 SQL-format 原理之前,我们对于 mysqldump 导出的文件作一个简要的兼容性分析。SQL-format文件内容主要是可执行的SQL语句,例如:DCL, DDL, Insert SQL以及Comment信息。但是这些语句并非OceanBase是可以兼容的。下面举一个例子:
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
上述SQL语句在MySQL中称之为 single-line /*! */ version comments,它与普通的 comments 区别在于SQL引擎并非直接跳过该注释语句,而是根据条件选择性地执行,上述语句SQL引擎会判断当前的MySQL数据库版本是否大于等于4.0.0?只有版本满足条件才会执行后续的变更语句,否则跳过。但是 OceanBase 会把上述语句当作普通的 multiple-line comment 语句处理,这会导致 single-line /*! */ version comments 中定义的Schema可能会丢失,最终造成数据库导入信息缺失的问题。同时,OceanBase 语法、功能上也未支持上述ALTER语句的变更功能,诸如此类的兼容问题较多。未来 OBLOADER 研发同学会考虑对于 mysqldump 导出的 SQL-format 文件进行分析、识别与转换处理,最大程度保证数据库的定义信息可以导入进 OceanBase 中。
写在最后
数据库以及生态工具的兼容性处理是一项非常细致且复杂的工作。如果想开发一款好用的工具产品,要求开发者对数据库的原理特性甚至是细节方面都有深入的了解和把握。OBLOADER 正在尝试解决异构数据库之间的导入导出所面对的各种兼容性的问题,尽最大努力让同异构数据库之间的导入导出工作变得更加平顺一些。
相关文章:

从MySQL到OceanBase离线数据迁移的实践
本文作者:玉璁,OceanBase 生态产品技术专家。工作十余年,一直在基础架构与中间件领域从事研发工作。现负责OceanBase离线导数产品工具的研发工作,致力于为 OceanBase 建设一套完善的生态工具体系。 背景介绍 在互联网与云数据库技…...
ifconfig 和 ip addr
1. 工具所属套件 ifconfig:属于较老的 net-tools 套件。曾是 Unix 和 Linux 系统上广泛使用的工具。ip addr:属于较新的 iproute2 套件。它取代了 ifconfig,并逐渐成为现代 Linux 系统上更常用的工具。 2. 功能覆盖范围 ifconfigÿ…...
NCCL报错
1、报错信息: raise RuntimeError("Distributed package doesnt have NCCL " "built in") RuntimeError: Distributed package doesnt have NCCL built in 2、报错原因: windows系统不支持nccl,采用gloo; …...
域7:安全运营 第16章 安全运营管理
第七域包括 16、17、18、19 章。 第七域所涵盖的广泛知识点,与我们的安全运营工作之间存在着高度的契合性。这些知识点不仅为我们的安全运营提供了有力的理论支撑,还使得SOC(安全运营中心)在日常运作中能够更加高效地发挥作用。通…...
研发线上事故风险解读之数据库存储
专业在线打字练习平台-巧手打字通,只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》,进一步深入梳理线上事故数据存储方面的问题点,重点关注数据库存储在使用和优化过程中可能出现的问题,旨在为读者提供具有实践指导…...
react hooks中在setState后输出state为啥没有变化,如何解决
在 React Hooks 中,setState 的概念被 useState 或 useReducer 钩子所替代。与类组件中的 setState 一样,这些钩子也是异步更新状态的。因此,如果你尝试在调用 setState(即 setXXX 函数)后立即读取状态值,你…...

C++设计模式——代理模式
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言代理模式的定义代理模式的具体实现 引言 我们经常听到代理服务器「代理服务器是一个中间服务器,能够接收客户端的请求,并代表客户端向服务器发起请求,然后将服…...
docker 复制文件,清除不再使用数据导出以及导出文件系统
docker cp -a centos :/etc/centos-release #将容器内文件复制到宿主机 docker cp /etc/issue centos:/root #将宿主机文件复制到容器内 docker export: 将一个运行的或者挺值得容器的文件系统导出为一个tar归档文件。需要注意,docker export 不会包含该…...

【Vue】Vue3.0(十一)Vue 3.0 中 computed 计算属性概念、使用及示例
上篇文章:【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月15日10点23分 文章目录 Vue 3.0中…...

【第三版 系统集成项目管理工程师】第17章 法律法规和标准规范
持续更新。。。。。。。。。。。。。。。 【第三版】第17章 法律法规和标准规范 17.1法律法规17.1.1 法与法律 P5801.基本概念-P5802.本质与特征-P580 17.1.2 法律体系1.世界法律体系(非重点)-P5802.中国特色社会主义法律体系-P581 17.1.3 法的效力1.对象效力-P5822.空间效力-…...

安装 LLM 编程工具 cursor
1,网址 cursor.com 点击 Download for Free 下载安装包 下载到一个300KB的安装压缩包,解压后双击后,点 open 安装过成会下载真正的应用程序 点击 continue 登陆 比如选择使用 github账号登陆 则会弹出如下网页: 先登陆 github&a…...
Java链式编程的定义、例子、使用方法、实际应用场景、自动装配构造
链式编程(Fluent Interface)是一种编程风格,允许通过方法调用连接在一起进行操作,通常用于提高代码的可读性和简洁性。在 Java 中,链式编程常通过返回 this(当前对象)来实现。这种做法在构建器模…...
用 Git Stash 临时保存修改,轻松切换任务!
在开发过程中,我们经常会遇到这样的情况:正在写代码,突然领导或同事让你赶紧处理一个紧急 bug,但你当前的代码还没写完,不能提交,这时候该怎么办呢?别慌,Git 的 stash 命令正好能帮上…...

Android 下通过触发 SIGTRAP 信号实现反调试
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 详细的 Linux 信号列表 Linux 信号是一种用于进程间通信(IPC)和异常处理的机制。以下是详细的 Linux 信号列表,包含信号名…...

【MySQL】 表的增删操作
目录 1.Create(增) 1.1.单行数据 全列插入 1.2.多行数据 指定列插入 1.3.插入否则更新 1.4.替换数据(REPLACE) 2.Delete(删) 2.1.删除表中的某个条目 2.2.删除整张表数据 2.3.截断表 1.Create…...

新生入门季 | 学习生物信息分析,如何解决个人电脑算力不足的问题?
随着生物信息学在科研和教育中的快速普及,越来越多的新生开始接触基因组测序、RNA分析等复杂计算任务。然而,在面对这些大规模数据时,个人电脑的算力往往显得捉襟见肘。你是否也在为自己的笔记本性能不足而苦恼? 这篇文章将为你提…...
20255 - 中医方剂学 - 考研 - 执业
第1章 总论 1.我国现存最早的记载方剂的医书是()( ) [单选] A.《太平圣惠方》 B.《黄帝内经》 C.《五十二病方》 D.《千金要方》 E.《外台秘要》 正确答案: C 2.我国最早的中医经典理论著作是()( ) [单选] A.《伤寒杂病论…...

【Vue.js设计与实现】第三篇第9章:渲染器-简单Diff算法-阅读笔记
文章目录 9.1 减少 DOM 操作的性能开销9.2 DOM 复用与 key 的作用9.3 找到需要移动的元素9.4 如何移动元素9.5 添加新元素9.6 移除不存在的元素 系列目录:【Vue.js设计与实现】阅读笔记目录 当新旧vnode 的子节点都是一组节点时,为了以最小的性能…...

服务器软件之Tomcat
服务器软件之Tomcat 服务器软件之Tomcat 服务器软件之Tomcat一、什么是Tomcat二、安装Tomcat1、前提:2、下载3、解压下载的tomcat4、tomcat启动常见错误4.1、tomcat8.0 startup报错java.util.logging.ErrorManager: 44.2、java.lang.UnsatisfiedLinkError 三、Tomca…...

Flutter包管理(三)
1、作用 在APP的实际开发过程中往往会依赖很多包,而这些包之间存在着交叉依赖、版本依赖,由开发者自己管理手动管理会非常麻烦,每种开发生态或编程官方会提供一些包的管理工具,在Flutter中我们在pubspec.yaml文件中来管理第三方依…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...