本文以 Amazon Aurora MySQL 为例介绍如何使用 DM 从 MySQL 协议数据库迁移数据到 TiDB。
假设有两个 Aurora 集群需要迁移数据到 TiDB,其集群信息如下,其中 Aurora-1 包含一个独立的读取器节点。
| 集群 | 终端节点 | 端口 | 角色 |
|---|---|---|---|
| Aurora-1 | pingcap-1.h8emfqdptyc4.us-east-2.rds.amazonaws.com | 3306 | 写入器 |
| Aurora-1 | pingcap-1-us-east-2a.h8emfqdptyc4.us-east-2.rds.amazonaws.com | 3306 | 读取器 |
| Aurora-2 | pingcap-2.h8emfqdptyc4.us-east-2.rds.amazonaws.com | 3306 | 写入器 |
DM 在增量同步阶段依赖 ROW 格式的 binlog,如果未启用 binlog 及设置正确的 binlog 格式,则不能正常使用 DM 进行数据同步,具体可参见
Aurora 读取器不能开启 binlog,因此不能作为 DM 数据迁移时的上游 master server。
如果需要基于 GTID 进行数据迁移,还需要为 Aurora 集群启用 GTID 支持。
在 Aurora 集群中,binlog 相关参数是集群参数组中的集群级参数,有关如何为 Aurora 集群启用 binlog 支持,请参考在复制主实例上启用二进制日志记录。在使用 DM 进行数据迁移时,需要将 binlog_format 参数设置为 ROW。
如果需要基于 GTID 进行数据迁移,需要将 gtid-mode 与 enforce_gtid_consistency 均设置为 ON。有关如何为 Aurora 集群启用基于 GTID 的数据迁移支持,请参考 Configuring GTID-Based Replication for an Aurora MySQL Cluster。
注意:
在 Aurora 管理后台中,
gtid_mode参数表示为gtid-mode。
目前推荐使用 DM-Ansible 部署 DM 集群,具体部署方法参照
使用 DM-Ansible 部署 DM 集群后,相关配置信息如下:
| 组件 | 主机 | 端口 |
|---|---|---|
| dm_worker1 | 172.16.10.72 | 8262 |
| dm_worker2 | 172.16.10.73 | 8262 |
| dm_master | 172.16.10.71 | 8261 |
| 数据库实例 | 主机 | 端口 | 用户名 | 加密密码 |
|---|---|---|---|---|
| 上游 Aurora-1 | pingcap-1.h8emfqdptyc4.us-east-2.rds.amazonaws.com | 3306 | root | VjX8cEeTX+qcvZ3bPaO4h0C80pe/1aU= |
| 上游 Aurora-2 | pingcap-2.h8emfqdptyc4.us-east-2.rds.amazonaws.com | 3306 | root | VjX8cEeTX+qcvZ3bPaO4h0C80pe/1aU= |
| 下游 TiDB | 172.16.10.83 | 4000 | root |
假设需要将 Aurora-1 和 Aurora-2 实例的 test_db 库的 test_table 表以全量+增量的模式同步到下游 TiDB 的 test_db 库的 test_table 表。
复制并编辑 {ansible deploy}/conf/task.yaml.example,生成如下任务配置文件 task.yaml:
./dmctl --master-addr 172.16.10.71:8261
执行以下命令启动数据同步任务(task.yaml 是之前编辑的配置文件)
start-task ./task.yaml
如果执行命令后的返回结果中不包含错误信息,则表明任务已经成功启动
如果包含以下错误信息,则表明上游 Aurora 用户可能拥有 TiDB 不支持的权限类型
{
"id": 4,
"name": "source db dump privilege chcker",
"desc": "check dump privileges of source DB",
"state": "fail",
"errorMsg": "line 1 column 285 near \"LOAD FROM S3, SELECT INTO S3 ON *.* TO 'root'@'%' WITH GRANT OPTION\" ...",
"instruction": "",
"extra": "address of db instance - pingcap-1.h8emfqdptyc4.us-east-2.rds.amazonaws.com"
},
{
"id": 5,
"name": "source db replication privilege chcker",
"desc": "check replication privileges of source DB",
"state": "fail",
"errorMsg": "line 1 column 285 near \"LOAD FROM S3, SELECT INTO S3 ON *.* TO 'root'@'%' WITH GRANT OPTION\" ...",
"instruction": "",
"extra": "address of db instance - pingcap-1.h8emfqdptyc4.us-east-2.rds.amazonaws.com"
}
此时可以选择以下两种处理方法中的任意一种进行处理后,再使用 start-task 尝试重新启动任务:
为用于进行数据迁移的 Aurora 用户移除不被 TiDB 支持的不必要的权限
如果能确保 Aurora 用户拥有 DM 所需要的权限,可以在 task.yaml 配置文件中添加如下顶级配置项以跳过启用任务时的前置权限检查
ignore-checking-items: ["dump_privilege", "replication_privilege"]
如需了解 DM 集群中是否存在正在运行的同步任务及任务状态等信息,可在 dmctl 内使用以下命令进行查询:
query-status
注意:
如果查询命令的返回结果中包含以下错误信息,则表明在全量同步的 dump 阶段不能获得相应的 lock:
Couldn't acquire global lock, snapshots will not be consistent: Access denied for user 'root'@'%' (using password: YES)此时如果能接受不使用 FTWL 来确保 dump 文件与 metadata 的一致或上游能暂时停止写入,可以通过为
mydumpers下的extra-args添加--no-locks参数来进行绕过,具体方法为:
- 使用
stop-task停止当前由于不能正常 dump 而已经转为 paused 的任务- 将原
task.yaml中的extra-args: "-B test_db -T test_table"更新为extra-args: "-B test_db -T test_table --no-locks"- 使用
start-task重新启动任务
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3160523/ ,如需转载,请注明出处,否则将追究法律责任。