- 文档首页
数据库传输服务
最佳实践
使用 DTS 同步 MariaDB 数据至火山引擎 MySQL 版
最佳实践
使用 DTS 同步 MariaDB 数据至火山引擎 MySQL 版
使用 DTS 同步 MariaDB 数据至火山引擎 MySQL 版
在数据库上云或更换数据库平台的场景中,您可能需要将本地 IDC、友商云或其他服务器上自建的 MariaDB 数据同步至火山引擎的云数据库 MySQL 版实例中。本文介绍如何在数据库传输服务 DTS 将 MariaDB 数据同步到云数据库 MySQL 版实例。
- 已部署可通过公网访问的自建 MariaDB 实例,并创建具备同步权限的数据库账号。
- 源端 MariaDB 已开启 Binlog,且 binlog_format 设置为 ROW、binlog_row_image 设置为 FULL、server_id 大于 0,否则预检查会报错且无法启动增量同步。
- 源端和目标端所属服务器具备足够的出口带宽,否则会影响数据同步速率。
- 当前仅支持同步 MariaDB 10 版本的数据,如需同步 MariaDB 11、MariaDB 12 版本的数据,请提交工单。
- 源端 Binlog 至少保留 24 小时,建议保留 7 天以上,避免任务中断或重试期间因日志过期而失败。
- DTS 支持常规表结构的自动同步,但 MariaDB 专有的对象、数据类型、函数和语法不会被自动改写,需要您在同步前改造或在目标端手动创建,否则可能会导致结构初始化失败或增量任务报错。
- MariaDB 的 GTID 与 MySQL 不兼容,DTS 不使用 GTID 位点:仅增量同步数据时,任务首次启动按时间戳定位起始位点。任务启动后的断点续传按物理位点处理。建议在整个同步窗口内避免源端主备切换,否则任务可能因位点失效而报错。
- 暂不支持同步系统内置账号包括:mysql、mariadb.sys、healthcheck,如果业务依赖这些账号,那么请在同步前在目标端创建并授权。
- 全量初始化过程中目标数据库会产生大量 Binlog 文件,可能会导致目标库磁盘使用量远大于源实例。建议在全量初始化前调整目标数据库 Binlog 的保留策略。
- 完成数据同步后进行业务切换工作时,建议在停止源端写入并暂停相关业务后实施,或在业务低峰期操作,否则将对业务的正常运行造成影响。
用于同步的账号需具备以下最小权限:
MariaDB 与 MySQL 同源,但二者存在部分互不兼容的专有对象和语法,同步数据前,您必须对源库进行兼容性评估。通过数据库结构导出工具或人工排查确认是否存在以下 MariaDB 专有特性,若存在不兼容项,须在同步前完成业务改造。
- 兼容性评估:导出源端 MariaDB 的库表结构和对象定义,对照以下内容逐项排查 SEQUENCE、INET6、INVISIBLE、Aria 引擎、向量类型、专有函数等不兼容内容。
- 改造不兼容项示例:根据以下示例完成在源端和目标端的改造,无法通过 DTS 自动同步的对象,手动在目标端 MySQL 内创建。
*示例一:将 MariaDB 独立 SEQUENCE 序列改造为 MySQL 的 AUTO_INCREMENT 自增列
*场景说明
* MariaDB 支持使用独立的 SEQUENCE 序列对象配合 NEXT VALUE FOR 函数来生成自增主键。而 MySQL 不支持独立的 SEQUENCE 序列对象,需采用标准的 AUTO_INCREMENT 属性实现列级自增。
*改造步骤
*在 MySQL 端新建表时,为自增主键列添加 AUTO_INCREMENT 属性。
*移除 MariaDB 中创建 SEQUENCE 对象的 CREATE SEQUENCE 语句,以及原主键列中 DEFAULT NEXT VALUE FOR ... 的默认值声明。
*代码改造对比
*改造前:MariaDB 中使用 SEQUENCE 对象:
*
*改造后:MySQL 中使用 AUTO_INCREMENT:
*
示例一:将 MariaDB 独立 SEQUENCE 序列改造为 MySQL 的 AUTO_INCREMENT 自增列
MariaDB 支持使用独立的 SEQUENCE 序列对象配合 NEXT VALUE FOR 函数来生成自增主键。而 MySQL 不支持独立的 SEQUENCE 序列对象,需采用标准的 AUTO_INCREMENT 属性实现列级自增。
- 在 MySQL 端新建表时,为自增主键列添加 AUTO_INCREMENT 属性。
- 移除 MariaDB 中创建 SEQUENCE 对象的 CREATE SEQUENCE 语句,以及原主键列中 DEFAULT NEXT VALUE FOR ... 的默认值声明。
- 改造前:MariaDB 中使用 SEQUENCE 对象:
- 改造后:MySQL 中使用 AUTO_INCREMENT:
*示例二:将 INET6 类型改造为 VARCHAR(64)
*场景说明
* MariaDB 原生支持 INET6 数据类型用于存储 IPv6 地址,但 MySQL 的 5.7 版本和早期的 8.0 版本不支持该类型。同步前需将其转换为兼容性最好的字符串类型。
*改造建议
* 可根据业务存储形式将 INET6 转换为 VARCHAR(64),或使用 VARBINARY(16) 配合 INET6_ATON()、INET6_NTOA() 存取。使用 VARCHAR(64) 可以为不同 IPv6 文本表示形式预留空间。
*代码改造对比
*改造前:MariaDB 环境
*
*改造后:MySQL 环境
*
示例二:将 INET6 类型改造为 VARCHAR(64)
MariaDB 原生支持 INET6 数据类型用于存储 IPv6 地址,但 MySQL 的 5.7 版本和早期的 8.0 版本不支持该类型。同步前需将其转换为兼容性最好的字符串类型。
可根据业务存储形式将 INET6 转换为 VARCHAR(64),或使用 VARBINARY(16) 配合 INET6_ATON()、INET6_NTOA() 存取。使用 VARCHAR(64) 可以为不同 IPv6 文本表示形式预留空间。
*示例三:将 Aria 引擎改造为 InnoDB
*场景说明
* Aria 是 MariaDB 特有的存储引擎,通常用于内部临时表或特定场景,MySQL 完全不支持该引擎。若表结构中包含 ENGINE=Aria,那么在 MySQL 端执行创建表语句时会报错。
*改造建议
* InnoDB 是 MySQL 的默认且最推荐的存储引擎,支持事务、行级锁和外键,建议在同步前将所有非 InnoDB 引擎(例如 Aria、MyISAM)统一转换为 InnoDB 引擎。
*代码改造对比
* 您可以在 MariaDB 源库中提前执行转换,或在 MySQL 目标库建表时修改引擎定义。
*确认当前表的引擎。
*
* 输出结果可能包含 ENGINE=Aria ...。
*执行引擎转换命令。
*
*再次执行命令确认当前表的引擎。
*
* 输出结果应为:ENGINE=InnoDB ...。
Aria 是 MariaDB 特有的存储引擎,通常用于内部临时表或特定场景,MySQL 完全不支持该引擎。若表结构中包含 ENGINE=Aria,那么在 MySQL 端执行创建表语句时会报错。
InnoDB 是 MySQL 的默认且最推荐的存储引擎,支持事务、行级锁和外键,建议在同步前将所有非 InnoDB 引擎(例如 Aria、MyISAM)统一转换为 InnoDB 引擎。
您可以在 MariaDB 源库中提前执行转换,或在 MySQL 目标库建表时修改引擎定义。
- 输出结果可能包含 ENGINE=Aria ...。
- 输出结果应为:ENGINE=InnoDB ...。
同步任务的操作步骤和公有网络 MySQL 同步一致,详细信息,请参见源为公有网络 MySQL 同步至火山引擎版 MySQL。 - 在配置源库时,实例类型选择 MySQL,接入方式选择公有网络 MySQL,然后填写 MariaDB 的公网地址、端口、数据库账号和密码。
- 为了防止在业务切换后,云上业务出现异常,建议您创建双向同步任务。
在停止源端 MariaDB 的业务写入后,需确认源库无活跃写事务,并持续观察 DTS 增量同步延迟。待增量延迟降至 0(或稳定在可接受的低水位),且全量数据校验结果一致后,方可执行最终的业务割接。
- 等待同步完成:等待结构初始化和全量初始化完成,任务进入增量同步阶段,观察增量延迟。
- 源库静默检查:待数据校验结果一致且增量延迟降低至接近 0 后,登录源端 MariaDB 数据库,执行下述命令查看当前会话状态,确保没有新的会话执行写入操作。
- 执行业务切割:确认源库无写入且同步无延迟后,将业务连接地址切换至目标 MySQL实例(火山引擎云数据库 MySQL 版)。
- 暂停正向同步任务。详细操作,请参见暂停同步任务。
当正向同步任务处于已暂停时,请不要随意启动任务,否则可能会导致数据不一致。
- 如果业务切换后云上数据库出现异常,请立即停止云上业务的写入。
- 建立反向同步链路:需等待反向同步延迟降至 0,并确认云上新增数据已同步至源端 MariaDB 后,再将业务连接地址切回源端。
- 未建立反向同步链路:请勿直接切回源端,应先评估并回迁云上新增数据,避免数据丢失。
最近更新时间:2026.11.03 15:20:32