从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 官方的介绍:

1686041408

提示: 
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 正在尝试解决异构数据库之间的导入导出所面对的各种兼容性的问题,尽最大努力让同异构数据库之间的导入导出工作变得更加平顺一些。

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

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

相关文章

R实验——logistic回归、LDA、QDAKNN

数据集介绍&#xff1a; mpg&#xff0c;miles per gallon即油耗&#xff0c;这个数据集来自卡内基梅隆大学维护的StatLib库。1983年美国统计协会博览会使用了该数据集。这个数据集是对StatLib库中提供的数据集稍加修改的版本。根据Ross Quinlan(1993)在预测属性“mpg”中的使…

vuex模块化使用

正常使用&#xff1a; // src/store/index.jsimport Vue from vue; import Vuex from vuex;Vue.use(Vuex);export default new Vuex.Store({state: {count: 0, // 一个简单的状态示例},mutations: {increment(state) {state.count;},decrement(state) {state.count--;},},acti…

【Linux报错】为什么“userdel 某用户”,这个用户还存在于家目录中?

你删除一个用户&#xff0c;却在 /home/ 家目录下还看到该用户家目录文件&#xff0c;是因为&#xff1a; 使用 userdel 命令来删除一个用户&#xff1a;默认情况下&#xff0c;该用户的主目录&#xff08;通常位于/home/username&#xff09;不会被自动删除。这是因为userdel有…

超硬核!大模型算法岗面试必问100题,我说的,不信就来看看

大模型算法岗常见面试题100道 *一、基础篇* 1、目前主流的开源模型体系有哪些&#xff1f; Transformer体系&#xff1a;由Google提出的Transformer 模型及其变体&#xff0c;如BERT、GPT 等。PyTorch Lightning&#xff1a;一个基于PyTorch的轻量级深度学习框架&#xff0c;…

如何将 Docker 镜像的 tar 文件迁移到另一台服务器并运行容器

实验室项目共建人&#xff1a;周凌飞、武正乔、杨霄汉 特别鸣谢&#xff1a;bilibili 博主 老韩一米九、一堂 杨国帅 提供设备部署以及上线指导 本博客部分内容由kimi生成&#xff0c;鸣谢&#xff1a;吴润生 迭代生成式AI提示词思考模型 在 Docker 容器化的世界里&#xf…

弱口令与命令爆破+DVWA靶场+docker+ARL+Fofa+weakpass

关于弱口令与命令爆破、DVWA靶场、Docker、ARL、Fofa和weakpass&#xff0c;以下是一些关键信息&#xff1a; 弱口令与命令爆破&#xff1a;弱口令指的是容易被攻击者猜测或被破解工具破解的口令。例如&#xff0c;使用单字、家族名称、太短的密码或可预测的模式&#xff08;如…

某科技——北京——国护蓝中研判岗

文章目录 所面试的公司&#xff1a;某科技所在城市&#xff1a;北京面试职位&#xff1a;国护蓝中研判岗面试过程&#xff1a; 面试官的问题&#xff1a;1、面试官先就是很常态化的让我做了一个自我介绍2、自我介绍不错&#xff0c;听你讲熟悉TOP10漏洞&#xff0c;可以讲下自己…

开源限流组件分析(三):golang-time/rate

文章目录 本系列前言提供获取令牌的API数据结构基础方法tokensFromDurationdurationFromTokensadvance 获取令牌方法reverseN其他系列API 令人费解的CancelAt是bug吗 取消后无法唤醒其他请求 本系列 开源限流组件分析&#xff08;一&#xff09;&#xff1a;juju/ratelimit开源…

Java之继承抽象类用法实例(三十一)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

一次文件重写后,文件修改时间未发生变化的原因

昨天用python写了一个脚本&#xff0c;用于统计店铺的某些数据&#xff0c;然后将数据存储在文本里&#xff0c;定时每天早上执行。 昨天傍晚写完的&#xff0c;执行了一下&#xff0c;执行完成后&#xff0c;此时文本修改时间为2024-10-22 18:00。 早上来公司一看&#xff0…

git命令笔记(速查速查)

git命令功能总结 1.创建git的本地仓库2. 配置本地仓库(name和email地址)3. 工作区、版本库、暂存区、对象区3.1 add, commit3.2 打印提交日志3.2 修改文件 4.版本回退&#xff08;git reset&#xff09;5. 撤销修改&#xff08;在push之前撤销&#xff09;6.删除版本库中的文件…

SQL Injection | SQL 注入分类 —— 查询方式

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 在进行 SQL 注入攻击时&#xff0c;如果目标服务器的后端 SQL 查询不返回任何结果&#xff08;即无回显&#xff09;&#xff0c;我们可能需要采用 SQL 盲注技术来进行进一步的测试。盲注是一种在无法…

SSM框架学习(七、MyBatis-Plus高级用法:最优化持久层开发)

目录 一、MyBatis-Plus快速入门 1.简介 2.快速入门 二、MyBatis-Plus核心功能 1.基于Mapper接口CRUD &#xff08;1&#xff09;Insert 方法 &#xff08;2&#xff09;Delete方法 &#xff08;3&#xff09;Update 方法 &#xff08;4&#xff09;Select方法 2.基于Serv…

用PHP写一个EACO(drc20)写一个和狗狗币,比特币,avax, bnb,eth,sol,usdt,等全球前30大数字货币的兑换去中心化小程序。

创建一个简单的PHP小程序&#xff0c;用于EACO&#xff08;DRC20&#xff09;与全球前30大数字货币&#xff08;如狗狗币、比特币、AVAX、BNB、ETH、SOL、USDT等&#xff09;进行去中心化兑换的功能&#xff0c;需要集成加密货币的API接口来获取实时汇率和执行兑换操作。以下是…

Chrome DevTools 三: Performance 性能面板扩展—— 性能优化

Performance 性能 &#xff08;一&#xff09;性能指标 首次内容绘制 (First Contentful Paint&#xff0c;FCP)&#xff1a; 任意内容在页面上完成渲染的时间 最大内容绘制 (Largest Contentful Paint&#xff0c;LCP)&#xff1a; 最大内容在页面上完成渲染的时间 第一字节…

《中国结算全国股份转让系统—结算参与人数据接口规范》

《中国结算全国股份转让系统—结算参与人数据接口规范》 本文档在原《中国结算全国股份转让系统结算参与人数据接口规范&#xff08;Ver1.2&#xff09;》基础上&#xff0c;依据《关于通过中国结算缴纳身份验证费的业务说明》、《关于通过中国结算缴纳手机号码核查费的业务说明…

283.移动零

目录 题目解法解释&#xff1a; .reverse()怎么用的&#xff1f;Char 13: error: no matching function for call to reverse 什么是双指针&#xff1f;双指针的常见类型&#xff1a;总结&#xff1a; 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末…

【Java函数篇】Java8中的Lambda表达式实战详解

文章标题 什么是lambda表达式Lambda表达式示例Lambda表达式特点更多实战案例场景1&#xff1a;使用 lambda 表达式迭代列表并对列表项执行某些操作场景2&#xff1a;使用 lambda 表达式在 Java 中创建并启动线程场景3&#xff1a;使用 lambda 表达式向 GUI 组件添加事件监听器 …

88.【C语言】文件操作(5)

目录 文件的随机读写 1.fseek函数 代码示例 运行结果 2.ftell函数 代码示例 运行结果 3.rewind函数 代码示例 运行结果 承接79.【C语言】文件操作(4)文章 文件的随机读写 1.fseek函数 声明:int fseek ( FILE * stream, long int offset, int origin ); 格式:fsee…

APM 3.0.0|二次元味很冲的B站音乐软件

APM是一款专为B站音频设计的第三方播放器&#xff0c;支持从B站获取音频内容&#xff0c;提供桌面小组件&#xff0c;多语言支持&#xff0c;以及针对Android系统的优化。下载安装APK后打开应用&#xff0c;登录B站账号&#xff0c;浏览并播放音频内容。 大小&#xff1a;73M …