从 MariaDB 文件迁移数据到 TiDB

本文档介绍了如何将数据从 MariaDB 服务器迁移到 TiDB 集群。

前提条件

选择合适的迁移策略:

除了以上两种策略,还有其他策略适用于特定的场景,例如:

  • 使用 Object Relational Mapping (ORM) 工具重新部署和迁移数据。
  • 修改应用程序,使其在迁移过程中同时写入 MariaDB 和 TiDB。

本文档仅介绍前两种策略。

根据你选择的策略,准备以下内容:

检查兼容性

TiDB 和 MySQL 兼容,而 MySQL 和 MariaDB 也有很多通用的特性。在迁移数据前需要注意,可能某些 MariaDB 特有的特性和 TiDB 并不兼容。

除了检查本小节介绍的事项之外,建议你参考 MariaDB Compatibility & Differences 检查相关配置。

认证

与 MySQL 安全特性差异文档列举了 TiDB 支持的认证方式。TiDB 不支持 MariaDB 中的某些认证方式,你可能需要为账号创建新的密码哈希,或采取其他相应措施。

你可以执行以下语句检查使用的认证方式:

SELECT plugin, COUNT(*) FROM mysql.user GROUP BY plugin;
+-----------------------+----------+ | plugin | COUNT(*) | +-----------------------+----------+ | mysql_native_password | 11 | +-----------------------+----------+ 1 row in set (0.002 sec)

系统版本表

TiDB 不支持系统版本表 (System-Versioned Table)。但是 TiDB 支持 AS OF TIMESTAMP,可以在某些场景下取代系统版本表。

你可以执行下列语句检查受影响的表:

SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE='SYSTEM VERSIONED';
+--------------+------------+ | TABLE_SCHEMA | TABLE_NAME | +--------------+------------+ | test | t | +--------------+------------+ 1 row in set (0.005 sec)

要删除 SYSTEM VERSIONING,执行 ALTER TABLE 语句:

MariaDB [test]> ALTER TABLE t DROP SYSTEM VERSIONING; Query OK, 0 rows affected (0.071 sec) Records: 0 Duplicates: 0 Warnings: 0

序列

MariaDB 和 TiDB 均支持 CREATE SEQUENCE,但是 DM 暂不支持。建议在迁移期间不要创建、修改或删除序列,尤其在迁移后要进行相关测试。

执行下列语句检查你是否在使用序列:

SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE='SEQUENCE';
+--------------+------------+ | TABLE_SCHEMA | TABLE_NAME | +--------------+------------+ | test | s1 | +--------------+------------+ 1 row in set (0.016 sec)

存储引擎

MariaDB 为本地数据提供了存储引擎,例如 InnoDBMyISAMAria。虽然 TiDB 不直接支持这些数据格式,但是你仍可以迁移这些数据。但是,也有一些存储引擎将数据放在服务器之外,例如 CONNECT 存储引擎和 Spider。虽然你可以将这些表迁移到 TiDB,但是 TiDB 无法将数据存储在 TiDB 集群外部。

执行下列语句检查你正在使用的存储引擎:

SELECT ENGINE, COUNT(*) FROM information_schema.tables GROUP BY ENGINE;
+--------------------+----------+ | ENGINE | COUNT(*) | +--------------------+----------+ | NULL | 101 | | Aria | 38 | | CSV | 2 | | InnoDB | 6 | | MEMORY | 67 | | MyISAM | 1 | | PERFORMANCE_SCHEMA | 81 | +--------------------+----------+ 7 rows in set (0.009 sec)

语法

MariaDB 支持 DELETEINSERTREPLACE 语句的 RETURNING 关键字。TiDB 不支持这些语句的关键字。你可能需要查看应用程序和查询日志,以检查它是否会影响数据迁移。

数据类型

MariaDB 支持的一些数据类型,例如 UUIDINET4INET6,TiDB 并不支持。

执行下列语句检查你正在使用的数据类型:

SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM information_schema.columns WHERE DATA_TYPE IN('INET4','INET6','UUID');
+--------------+------------+-------------+-----------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | DATA_TYPE | +--------------+------------+-------------+-----------+ | test | u1 | u | uuid | | test | u1 | i4 | inet4 | | test | u1 | i6 | inet6 | +--------------+------------+-------------+-----------+ 3 rows in set (0.026 sec)

字符集和排序规则

TiDB 不支持 MariaDB 中常用的 latin1_swedish_ci 排序规则。

执行下列语句检查你正在使用的排序规则:

SHOW COLLATION;
+--------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------+---------+-----+---------+----------+---------+ | ascii_bin | ascii | 65 | Yes | Yes | 1 | | binary | binary | 63 | Yes | Yes | 1 | | gbk_bin | gbk | 87 | | Yes | 1 | | gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 | | latin1_bin | latin1 | 47 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | Yes | Yes | 1 | | utf8_general_ci | utf8 | 33 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 1 | | utf8mb4_0900_ai_ci | utf8mb4 | 255 | | Yes | 1 | | utf8mb4_0900_bin | utf8mb4 | 309 | | Yes | 1 | | utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 | | utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 1 | +--------------------+---------+-----+---------+----------+---------+ 13 rows in set (0.0012 sec)

执行下列语句检查当前表的列使用的排序规则:

SELECT TABLE_SCHEMA, COLLATION_NAME, COUNT(*) FROM information_schema.columns GROUP BY TABLE_SCHEMA, COLLATION_NAME ORDER BY COLLATION_NAME;
+--------------------+--------------------+----------+ | TABLE_SCHEMA | COLLATION_NAME | COUNT(*) | +--------------------+--------------------+----------+ | sys | NULL | 562 | | test | NULL | 14 | | mysql | NULL | 84 | | performance_schema | NULL | 892 | | information_schema | NULL | 421 | | mysql | latin1_swedish_ci | 34 | | performance_schema | utf8mb3_bin | 38 | | mysql | utf8mb3_bin | 61 | | sys | utf8mb3_bin | 40 | | information_schema | utf8mb3_general_ci | 375 | | performance_schema | utf8mb3_general_ci | 244 | | sys | utf8mb3_general_ci | 386 | | mysql | utf8mb3_general_ci | 67 | | mysql | utf8mb4_bin | 8 | +--------------------+--------------------+----------+ 14 rows in set (0.045 sec)

更多信息,请参考字符集和排序规则

使用 Dumpling 导出数据后使用 TiDB Lightning 导入

该迁移策略假定你将应用程序下线,迁移数据,然后重新配置应用程序以使用迁移后的数据。

将数据从 MariaDB 迁移到 TiDB 的操作步骤如下:

  1. 停止应用程序。将应用程序下线。这样可以确保在迁移过程中或迁移之后,MariaDB 中的数据不会被修改。

  2. 导出数据。首先使用 tiup dumpling 命令从 MariaDB 导出数据。

    tiup dumpling --port 3306 --host 127.0.0.1 --user root --password secret -F 256MB -o /data/backup
  3. 使用 tiup tidb-lightning 命令恢复数据。请参考TiDB Lightning 快速上手了解如何配置及运行 TiDB Lightning。

  4. 迁移用户账号和权限。请参考导出用户和授权了解如何迁移用户账号和权限。

  5. 重新配置应用程序。你需要修改应用程序的配置,使其可以连接到 TiDB 服务器。

  6. 清理环境。一旦确认迁移成功,你可以在 MariaDB 中做最后一次备份,然后停止 MariaDB 服务器。你可以删除 TiUP、Dumpling 和 TiDB Lightning 等工具。

使用 DM 迁移数据

该策略假定你将应用程序下线,等待复制数据,然后重新配置应用程序以使用 TiDB。

要使用 DM,你需要使用 TiUP 集群TiDB Operator 部署一组 DM 服务。之后,使用 dmctl 配置 DM 服务。

第 1 步:准备工作

确保 MariaDB 上启用了 binlog,并且 binlog_format 设置为 ROW。建议设置 binlog_annotate_row_events=OFFlog_bin_compress=OFF

你还需要一个拥有 SUPER 权限或 BINLOG MONITORREPLICATION MASTER ADMIN 权限的账号。该账号还需要对你要迁移的数据库有读权限。

如果你不使用拥有 SUPER 权限的账号,那么你可能需要在 DM 配置中添加以下内容,因为 TiDB 不知道如何检查 MariaDB 特有的权限。

ignore-checking-items: ["replication_privilege"]

使用 DM 迁移数据前,可以使用预检查上游数据库配置是否正确,以确保迁移顺利进行。更多信息,请参考 TiDB Data Migration 任务前置检查

第 2 步:迁移数据

参考 TiDB Data Migration 快速上手指南了解如何从 MariaDB 迁移数据到 TiDB。

注意,与从 MariaDB 到 MariaDB 迁移数据时不同,你不需要先复制初始数据,因为 DM 会完成相关操作。

第 3 步:迁移用户账号和权限

参考导出用户和授权了解如何迁移用户账号和权限。

第 4 步:测试数据

一旦数据开始迁移,你可以在其上运行只读查询来验证数据。更多信息,请参考测试应用程序

第 5 步:切换系统

要将系统切换到 TiDB,你需要执行以下操作:

  1. 停止应用程序。
  2. 监控复制延迟,它应该变为 0 秒。
  3. 修改应用程序的配置,使其连接到 TiDB,然后重新启动应用程序。

要检查复制延迟,使用 dmctl 运行 query-status <taskname>,并检查 subTaskStatus 中的 "synced: true"

第 6 步:清理环境

一旦确认迁移成功,你可以在 MariaDB 中做最后一次备份,然后停止 MariaDB 服务器。这也意味着你可以停止并删除 DM 集群。

导出用户和授权

你可以使用 pt-show-grants 导出用户和授权。它是 Percona Toolkit 的一部分,用于从 MariaDB 导出用户和授权,并将其加载到 TiDB 中。

测试应用程序

虽然可以使用 sysbench 等通用工具进行测试,但是强烈建议你测试应用程序的某些特定功能。例如,使用临时数据副本,运行应用程序的副本,连接到 TiDB 集群。

这些测试可以确保应用程序与 TiDB 的兼容性和性能。你需要监控应用程序和 TiDB 的日志,以查看是否有任何需要解决的警告。确保测试应用程序使用的数据库驱动程序,例如 Java 应用程序的 MySQL Connector/J。如有必要,你可能需要使用 JMeter 等应用程序对应用程序进行负载测试。

验证数据

你可以使用 sync-diff-inspector 验证 MariaDB 和 TiDB 中的数据是否相同。