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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【码农必备】CasaOS香橙派安装Code server+cpolar让远程开发更轻松

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于Spring Boot、Vue和MyBatis的前后端分离座位管理系统:增删改查功能入门指南

在项目开发和工作实践中&#xff0c;创作灵感往往来自于对日常经验的总结与反思。通过记录技术难点和解决方案&#xff0c;不仅可以加深对问题的理解&#xff0c;还能为后续项目的优化提供参考。与此同时&#xff0c;撰写技术笔记、分享职场心得&#xff0c;不仅是对自己成长的…

一款基于 Vue 3 的现代化数据可视化组件库,功能强大,颜值爆表,开发者必备!(带私活源码)

Vue Data UI 是一款基于 Vue 3 的现代化数据可视化组件库&#xff0c;专为开发者提供强大的数据展示功能&#xff0c;旨在帮助用户通过图形化手段生动地讲述数据故事。该库由开源开发者 Graphieros 创建和维护&#xff0c;专注于提升图形渲染性能与交互体验&#xff0c;并致力于…

基于SSM汽车零部件加工系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;员工管理&#xff0c;经理管理&#xff0c;零件材料管理&#xff0c;产品类型管理&#xff0c;产品信息管理&#xff0c;产品出库管理&#xff0c;产品入库管理 员工账号功能包括&#xff1a;系统首页…

linuxdeployqt打包发布软件

文章目录 参考一、安装linuxdeployqt二、配置Qt的环境变量三、打包应用程序四、打包成deb包配置*.desktop桌面快捷方式文件五、创建deb包之control文件六、创建deb包之postrm文件(可以不创建)七、使用dpkg命令构建deb包八、deb包的安装与卸载参考 使用linuxdeployqt在linux下…

电影评论网站开发:Spring Boot技术指南

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

深入解析缓存与数据库数据不一致问题

缓存层是提高系统响应速度和扩展性的关键组件。然而&#xff0c;缓存层的引入也带来了数据一致性的挑战。 当数据库中的数据发生变化时&#xff0c;如何确保这些变化能够及时且准确地反映到缓存中&#xff0c;是确保用户体验和系统可靠性的重要问题。 1. 数据一致性 首先&am…

排序算法详解

稳定性 在排序算法中&#xff0c;稳定性是一个重要的概念&#xff0c;指的是在排序过程中&#xff0c;如果两个元素的值相等&#xff0c;它们在排序后的相对位置与排序前的相对位置保持不变的特性。 稳定排序与不稳定排序 稳定排序&#xff1a;在排序时&#xff0c;相等的元素…

【智能大数据分析 | 实验三】Storm实验:实时WordCountTopology

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

nginx中的HTTP 负载均衡

HTTP 负载均衡&#xff1a;如何实现多台服务器的高效分发 为了让流量均匀分配到两台或多台 HTTP 服务器上&#xff0c;我们可以通过 NGINX 的 upstream 代码块实现负载均衡。 方法 在 NGINX 的 HTTP 模块内使用 upstream 代码块对 HTTP 服务器实施负载均衡&#xff1a; upstr…

小新学习Docker之Ansible 的脚本 --- playbook 剧本

一、playbook 剧本简介 playbooks 本身由以下各部分组成&#xff1a; &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1a;变量 &#xff08;3…

【Java后端】之 ThreadLocal 详解

想象一下&#xff0c;你有一个工具箱&#xff0c;里面放着各种工具。在多人共用这个工具箱的时候&#xff0c;很容易出现混乱&#xff0c;比如有人拿走了你的锤子&#xff0c;或者你找不到合适的螺丝刀。为了避免这种情况&#xff0c;最好的办法就是每个人都有自己独立的工具箱…

商业智能(BI)及其常见技术

简介 商业智能&#xff08;Business Intelligence, BI&#xff09;是一系列技术和方法的集合&#xff0c;旨在帮助企业从大量数据中提取有用的信息&#xff0c;支持决策制定和业务优化。商业智能系统通常包括数据收集、数据存储、数据处理、数据分析和数据可视化等多个环节&am…

数据结构-顺序栈

栈&#xff1a;是一种特殊的线性表&#xff0c;其只允许在表尾进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;栈的插入操作叫…

nvm实现node多版本管理

在项目中是否遇到vue2和vue3项目同时要启动&#xff0c;而又得频繁去安装卸载node版本的困扰&#xff1f; Node Version Manager (nvm) 是一个用于管理多个 Node.js 版本的工具&#xff0c;它允许你在同一台机器上安装和切换不同版本的 Node.js&#xff0c;非常适合开发者在不…

Ubuntu22.04中安装英伟达驱动并部署Pytorch深度学习环境

安装英伟达驱动 本文基于windows10ubuntu22.04双系统&#xff0c;给ubuntu22.04安装英伟达驱动。 安装依赖。 sudo apt update # 获取最新的软件包信息 sudo apt upgrade # 升级软件包 sudo apt install g sudo apt install gcc sudo apt install make禁用ubuntu默认驱动Nouv…

Crawler4j在多线程网页抓取中的应用

网页爬虫作为获取网络数据的重要工具&#xff0c;其效率和性能直接影响到数据获取的速度和质量。Crawler4j作为一个强大的Java库&#xff0c;专门用于网页爬取&#xff0c;提供了丰富的功能来帮助开发者高效地抓取网页内容。本文将探讨如何利用Crawler4j进行多线程网页抓取&…

RHCE的学习(3)

第三章 远程登录服务 简介 概念 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机以取得可操作主机接口&#xff08;shell&#xff09;&#xff0c;而登录后的操作感觉就像是坐在系统前面一样 功能: 分享主机的运算能力 服务…

京存助力北京某电力研究所数据采集

北京某电力研究所已建成了一套以光纤为主&#xff0c;卫星、载波、微波等多种通信方式共存&#xff0c;分层级的电力专用的网络通信架构体系。随着用电、配电对网络的要求提高&#xff0c;以及终端通信入网的迅速发展&#xff0c;迫切地需要高效的通信管理系统来应对大规模、复…

Java项目-基于springboot框架的校园在线拍卖系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…