暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

使用DM迁移MySQL小量数据到TiDB

前置条件

  • 已使用TiUP部署DM集群:参考此前文章。
  • 已添加使用DM-worker时所需的上下游数据库用户权限、以及各处理单元所需的用户权限:参考如下表格。

上游数据库 (MySQL/MariaDB) 用户必须拥有以下权限:

权限 作用域
SELECT Tables
RELOAD Global
REPLICATION SLAVE Global
REPLICATION CLIENT Global

下游数据库 (TiDB) 用户必须拥有以下权限:

权限 作用域
SELECT Tables
INSERT Tables
UPDATE Tables
DELETE Tables
CREATE Databases,tables
DROP Databases,tables
ALTER Tables
INDEX Tables

处理单元所需的最小权限:

处理单元 最小上游 (MySQL/MariaDB) 权限 最小下游 (TiDB) 权限 最小系统权限
Relay log REPLICATION SLAVE (读取 binlog)、REPLICATION CLIENT (show master status, show slave status) 本地读/写磁盘
Dump SELECT、RELOAD(获取读锁将表数据刷到磁盘,进行一些操作后,再释放读锁对表进行解锁) 本地写磁盘
Load SELECT(查询 checkpoint 历史)、CREATE(创建数据库或表)、DELETE(删除 checkpoint)、INSERT(插入 dump 数据) 读/写本地文件
Binlog replication REPLICATION SLAVE(读 binlog)、REPLICATION CLIENT (show master status, show slave status) SELECT(显示索引和列)、INSERT (DML)、UPDATE (DML)、DELETE (DML)、CREATE(创建数据库或表)、DROP(删除数据库或表)、ALTER(修改表)、INDEX(创建或删除索引) 本地读/写磁盘

创建MySQL数据源

“小数据量”通常指MySQL 数据在 TB 级别以下。
如果是极小量数据(MB级别),还可以使用数据库连接工具的功能直接导。
一般而言,受到表结构索引数目等信息、硬件以及网络环境影响,迁移速率在 30~50GB/h 不等。

首先,新建 source1.yaml 文件,写入以下内容:

# 唯一命名,不可重复。
source-id: "mysql-01"

# DM-worker 是否使用全局事务标识符 (GTID) 拉取 binlog。使用前提是上游 MySQL 已开启 GTID 模式。若上游存在主从自动切换,则必须使用 GTID 模式。
enable-gtid: true

from:
  host: "10.0.8.86"         # 例如:172.16.10.81
  user: "wenjie.wang"
  password: "xxxxxx" # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用
  port: 3306

然后使用 tiup dmctl 将数据源配置加载到 DM 集群中:

tiup dmctl --master-addr ${advertise-addr} operate-source create source1.yaml

该命令中的参数描述如下:
参数 描述

  • –master-addr dmctl 要连接的集群的任意 DM-master 节点的 {advertise-addr},例如:172.16.10.71:8261
  • operate-source create 向 DM 集群加载数据源
    我们测试环境是:
cd /home/tidb/.tiup/bin
tiup dmctl --master-addr 10.0.8.86:8261 operate-source create /data/tidb/source1.yaml

可以看到输出结果:

Starting component dmctl: /home/tidb/.tiup/components/dmctl/v8.1.1/dmctl/dmctl --master-addr 10.0.8.86:8261 operate-source create /data/tidb/source1.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-01",
            "worker": "dm-10.0.8.86-8262"
        }
    ]
}

创建迁移任务

新建 task1.yaml 文件

vim /data/tidb/task1.yaml

写入以下内容:

# 任务名,多个同时运行的任务不能重名。
name: "test01"
# 任务模式,可设为
# full:只进行全量数据迁移
# incremental: binlog 实时同步
# all: 全量 + binlog 迁移
task-mode: "all"
# 下游 TiDB 配置信息。
target-database:
  host: "10.0.8.88"                   # 例如:172.16.10.83
  port: 4000
  user: "wenjie.wang"
  password: "xxxxxx"           # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用

# 当前数据迁移任务需要的全部上游 MySQL 实例配置。
mysql-instances:
-
  # 上游实例或者复制组 ID。
  source-id: "mysql-01"
  # 需要迁移的库名或表名的黑白名单的配置项名称,用于引用全局的黑白名单配置,全局配置见下面的 `block-allow-list` 的配置。
  block-allow-list: "listA"


# 黑白名单全局配置,各实例通过配置项名引用。
block-allow-list:
  listA:                              # 名称
    do-dbs: [pingcap", "test_collation"]

关于任务的更多配置项,可以参考 DM 任务完整配置文件介绍

启动任务

在你启动数据迁移任务之前,建议使用 check-task 命令检查配置是否符合 DM 的配置要求,以避免后期报错。

tiup dmctl --master-addr ${advertise-addr} check-task task.yaml

我们测试环境是:

cd /home/tidb/.tiup/bin
tiup dmctl --master-addr 10.0.8.86:8261 check-task  /data/tidb/task1.yaml

返回结果为:

Starting component dmctl: /home/tidb/.tiup/components/dmctl/v8.1.1/dmctl/dmctl --master-addr 10.0.8.86:8261 check-task /data/tidb/task1.yaml
{
    "result": true,
    "msg": "pre-check is passed. "
}

使用 tiup dmctl 执行以下命令启动数据迁移任务。

tiup dmctl --master-addr ${advertise-addr} start-task task.yaml

该命令中的参数描述如下:

  • –master-addr dmctl 要连接的集群的任意 DM-master 节点的 {advertise-addr},例如: 172.16.10.71:8261
  • start-task 参数用于启动数据迁移任务

如果任务启动失败,可根据返回结果的提示进行配置变更后执行 start-task task.yaml 命令重新启动任务。遇到问题请参考故障及处理方法以及常见问题

我们测试环境中执行:

tiup dmctl --master-addr 10.0.8.86:8261 start-task /data/tidb/task1.yaml

测试环境由于数据量少,很快完成迁移,返回结果为:

Starting component dmctl: /home/tidb/.tiup/components/dmctl/v8.1.1/dmctl/dmctl --master-addr 10.0.8.86:8261 start-task /data/tidb/task1.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-01",
            "worker": "dm-10.0.8.86-8262"
        }
    ],
    "checkResult": "pre-check is passed. "
}

检查目标tidb数据,已全部同步过来,如果collation为utf8mb3,则迁移后会变为utf8_bin,而utf8mb4则不会变。
目标tidb会新增两个迁移相关的库:

  • dm_meta
  • lightning_task_info

查看任务状态

如需了解 DM 集群中是否存在正在运行的迁移任务及任务状态等信息,可使用 tiup dmctl 执行 query-status 命令进行查询:

tiup dmctl --master-addr ${advertise-addr} query-status ${task-name}

关于查询结果的详细解读,请参考查询状态

监控任务与查看日志

(此步骤为非必要项。)
要查看迁移任务的历史状态以及更多的内部运行指标,可参考以下步骤。

如果使用 TiUP 部署 DM 集群时,正确部署了 Prometheus、Alertmanager 与 Grafana,则使用部署时填写的 IP 及端口进入 Grafana,选择 DM 的 Dashboard 查看 DM 相关监控项。

DM 在运行过程中,DM-worker、DM-master 及 dmctl 都会通过日志输出相关信息。各组件的日志目录如下:

  • DM-master 日志目录:通过 DM-master 进程参数 --log-file设置。如果使用 TiUP 部署 DM,则日志目录默认位于 /dm-deploy/dm-master-8261/log/。
  • DM-worker 日志目录:通过 DM-worker 进程参数 --log-file 设置。如果使用 TiUP 部署 DM,则日志目录默认位于 /dm-deploy/dm-worker-8262/log/。
最后修改时间:2024-10-21 14:02:06
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论