Data Migration 简介
TiDB Data Migration (DM) 是一体化的数据迁移任务管理工具,支持从与 MySQL 协议兼容的数据库(MySQL、MariaDB、Aurora MySQL)到 TiDB 的数据迁移。DM 工具旨在降低数据迁移的运维成本。使用 DM 进行数据迁移的时候,需要执行以下操作:
- 部署 DM 集群
- 创建上游数据源(source)对象,保存数据源访问信息
- 创建(多个)数据迁移任务从数据源迁移数据到 TiDB
数据迁移任务包含全量数据迁移、增量数据复制两个阶段:
- 全量数据迁移:从数据源迁移对应表的表结构到 TiDB,然后读取存量数据写入到 TiDB 集群;
- 增量数据复制:全量数据迁移完成后,从数据源读取对应的表变更然后写入到 TiDB 集群。
下文介绍 DM 所具备的功能。
基本功能
本节介绍 DM 工具的核心功能模块。
Block & allow lists
Block & Allow Lists 的过滤规则类似于 MySQL replication-rules-db
/replication-rules-table
,用于过滤或指定只迁移某些数据库或某些表的所有操作。
Binlog event filter
Binlog Event Filter 用于过滤源数据库中特定表的特定类型操作,比如过滤掉表 test
.sbtest
的 INSERT
操作或者过滤掉库 test
下所有表的 TRUNCATE TABLE
操作。
Table routing
Table Routing 是将源数据库的表迁移到下游指定表的路由功能,比如将源数据表 test
.sbtest1
的表结构和数据迁移到 TiDB 的表 test
.sbtest2
。它也是分库分表合并迁移所需的一个核心功能。
高级功能
分库分表合并迁移
DM 支持对源数据的分库分表进行合并迁移,但有一些使用限制,详细信息请参考悲观模式分库分表合并迁移使用限制和乐观模式分库分表合并迁移使用限制。
对第三方 Online Schema Change 工具变更过程的同步优化
在 MySQL 生态中,gh-ost 与 pt-osc 等工具被广泛使用,DM 对其变更过程进行了特殊的优化,以避免对不必要的中间数据进行迁移。详细信息可参考 online-ddl。
使用 SQL 表达式过滤某些行变更
在增量同步阶段,DM 支持配置 SQL 表达式过滤掉特定的行变更,以实现对同步数据的更精细控制。详细信息可参考使用 SQL 表达式过滤某些行变更。
使用限制
在使用 DM 工具之前,需了解以下限制:
数据库版本要求
- MySQL 版本 > 5.5
MariaDB 版本 >= 10.1.2
注意:
如果上游 MySQL/MariaDB servers 间构成主从复制结构,则需要 MySQL 版本高于 5.7.1 或者 MariaDB 版本等于或高于 10.1.3。
警告:
支持从 MySQL v8.0 迁移数据是 DM v2.0 的实验特性,不建议在生产环境下使用。
DDL 语法兼容性限制
目前,TiDB 部分兼容 MySQL 支持的 DDL 语句。因为 DM 使用 TiDB parser 来解析处理 DDL 语句,所以目前仅支持 TiDB parser 支持的 DDL 语法。详见 TiDB DDL 语法支持。
DM 遇到不兼容的 DDL 语句时会报错。要解决此报错,需要使用 dmctl 手动处理,要么跳过该 DDL 语句,要么用指定的 DDL 语句来替换它。详见如何处理不兼容的 DDL 语句。
分库分表数据冲突合并
- 如果业务分库分表之间存在数据冲突,可以参考自增主键冲突处理来解决;否则不推荐使用 DM 进行迁移,如果进行迁移则有冲突的数据会相互覆盖造成数据丢失。
- 分库分表 DDL 同步限制,参见悲观模式下分库分表合并迁移使用限制以及乐观模式下分库分表合并迁移使用限制。
数据源 MySQL 实例切换
- 当 DM-worker 通过虚拟 IP(VIP)连接到 MySQL 且要切换 VIP 指向的 MySQL 实例时,DM 内部不同的 connection 可能会同时连接到切换前后不同的 MySQL 实例,造成 DM 拉取的 binlog 与从上游获取到的其他状态不一致,从而导致难以预期的异常行为甚至数据损坏。如需切换 VIP 指向的 MySQL 实例,请参考虚拟 IP 环境下的上游主从切换对 DM 手动执行变更。