TiDB Data Migration 快速上手指南

本文介绍如何快速体验使用数据迁移工具 TiDB Data Migration (DM) 从 MySQL 迁移数据到 TiDB。

如需在生产环境中部署 DM,请参考以下文档:

  1. 使用 TiUP 部署 DM 集群
  2. 创建数据源对象
  3. 创建数据迁移任务

使用样例

在本地部署的 DM 集群组件和访问的 MySQL 和 TiDB 节点的信息如下:

实例 服务器地址 端口使用
DM-master 127.0.0.1 8261, 8291(内部端口)
DM-worker 127.0.0.1 8262
MySQL-3306 127.0.0.1 3306
TiDB 127.0.0.1 4000

使用 binary 包部署 DM

准备 DM binary 包

首先需要下载 DM 2.0 的 binary 或者手动编译。

第一种方式:下载最新 DM binary 包

  1. wget http://download.pingcap.org/dm-nightly-linux-amd64.tar.gz
  2. tar -xzvf dm-nightly-linux-amd64.tar.gz
  3. cd dm-nightly-linux-amd64

第二种方式:编译最新 DM binary 包

  1. git clone https://github.com/pingcap/dm.git
  2. cd dm
  3. make

部署 DM-master

执行如下命令启动 DM-master:

  1. nohup bin/dm-master --master-addr='127.0.0.1:8261' --log-file=/tmp/dm-master.log --name="master1" >> /tmp/dm-master.log 2>&1 &

部署 DM-worker

执行如下命令启动 DM-worker:

  1. nohup bin/dm-worker --worker-addr='127.0.0.1:8262' --log-file=/tmp/dm-worker.log --join='127.0.0.1:8261' --name="worker1" >> /tmp/dm-worker.log 2>&1 &

检查 DM 集群部署是否正常

  1. bin/dmctl --master-addr=127.0.0.1:8261 list-member

一个正常 DM 集群的范例返回结果如下所示:

  1. {
  2. "result": true,
  3. "msg": "",
  4. "members": [
  5. {
  6. "leader": {
  7. "msg": "",
  8. "name": "master1",
  9. "addr": "127.0.0.1:8261"
  10. }
  11. },
  12. {
  13. "master": {
  14. "msg": "",
  15. "masters": [
  16. {
  17. "name": "master1",
  18. "memberID": "11007177379717700053",
  19. "alive": true,
  20. "peerURLs": [
  21. "http://127.0.0.1:8291"
  22. ],
  23. "clientURLs": [
  24. "http://127.0.0.1:8261"
  25. ]
  26. }
  27. ]
  28. }
  29. },
  30. {
  31. "worker": {
  32. "msg": "",
  33. "workers": [
  34. {
  35. "name": "worker1",
  36. "addr": "127.0.0.1:8262",
  37. "stage": "free",
  38. "source": ""
  39. }
  40. ]
  41. }
  42. }
  43. ]
  44. }

从 MySQL 同步数据到 TiDB

准备数据

使用 DM 之前,先准备好数据,向 MySQL-3306 写入示例数据。

  1. drop database if exists `testdm`;
  2. create database `testdm`;
  3. use `testdm`;
  4. create table t1 (id bigint, uid int, name varchar(80), info varchar(100), primary key (`id`), unique key(`uid`)) DEFAULT CHARSET=utf8mb4;
  5. create table t2 (id bigint, uid int, name varchar(80), info varchar(100), primary key (`id`), unique key(`uid`)) DEFAULT CHARSET=utf8mb4;
  6. insert into t1 (id, uid, name) values (1, 10001, 'Gabriel García Márquez'), (2, 10002, 'Cien años de soledad');
  7. insert into t2 (id, uid, name) values (3, 20001, 'José Arcadio Buendía'), (4, 20002, 'Úrsula Iguarán'), (5, 20003, 'José Arcadio');

加载数据源 MySQL 配置

运行数据迁移任务前,需要加载数据源的配置,也就是 MySQL 的相关设置,到 DM。

对数据源 MySQL 访问密码进行加密

注意:

  • 如果数据源没有设置密码,则可以跳过该步骤。
  • DM v2.0 可以使用明文密码配置数据源的访问密码信息。

为了安全,可配置及使用加密后的 MySQL 访问密码,以密码为 “123456” 为例:

  1. ./bin/dmctl --encrypt "123456"
  1. fCxfQ9XKCezSzuCD0Wf5dUD+LsKegSg=

记录该加密后的密码,用于下面新建 MySQL 数据源。

编写数据源 MySQL 配置

把以下配置文件内容写入到 mysql-source-conf.yaml 中。

MySQL1 的配置文件:

  1. # MySQL Configuration.
  2. source-id: "mysql-replica-01"
  3. from:
  4. host: "127.0.0.1"
  5. user: "root"
  6. password: "fCxfQ9XKCezSzuCD0Wf5dUD+LsKegSg="
  7. port: 3306

加载数据源 MySQL 配置

在终端中执行下面的命令,使用 dmctl 将 MySQL 的数据源配置加载到 DM 集群中:

  1. ./bin/dmctl --master-addr=127.0.0.1:8261 operate-source create mysql-source-conf.yaml

结果如下:

  1. {
  2. "result": true,
  3. "msg": "",
  4. "sources": [
  5. {
  6. "result": true,
  7. "msg": "",
  8. "source": "mysql-replica-01",
  9. "worker": "worker1"
  10. }
  11. ]
  12. }

这样就成功将 MySQL-3306 数据源添加到了 DM 集群。

创建数据迁移任务

在导入准备数据后,进行以下操作将 MySQL 的 testdm.t1testdm.t2 两张表迁移到 TiDB。

  1. 创建任务的配置文件 testdm-task.yaml

    1. ---
    2. name: testdm
    3. task-mode: all
    4. target-database:
    5. host: "127.0.0.1"
    6. port: 4000
    7. user: "root"
    8. password: "" # 如果密码不为空,则推荐使用经过 dmctl 加密的密文
    9. mysql-instances:
    10. - source-id: "mysql-replica-01"
    11. block-allow-list: "ba-rule1"
    12. block-allow-list:
    13. ba-rule1:
    14. do-dbs: ["testdm"]
  2. 使用 dmctl 创建任务:

    1. ./bin/dmctl --master-addr 127.0.0.1:8261 start-task testdm-task.yaml

    结果如下:

    1. {
    2. "result": true,
    3. "msg": "",
    4. "sources": [
    5. {
    6. "result": true,
    7. "msg": "",
    8. "source": "mysql-replica-01",
    9. "worker": "worker1"
    10. }
    11. ]
    12. }

这样就成功创建了一个将 MySQL-3306 数据迁移到 TiDB 的任务。

查看迁移任务状态

在创建迁移任务之后,可以用 dmtcl query-status 来查看任务的状态。

  1. ./bin/dmctl --master-addr 127.0.0.1:8261 query-status

结果如下:

  1. {
  2. "result": true,
  3. "msg": "",
  4. "tasks": [
  5. {
  6. "taskName": "testdm",
  7. "taskStatus": "Running",
  8. "sources": [
  9. "mysql-replica-01"
  10. ]
  11. }
  12. ]
  13. }