全部产品
云市场

如何基于 DataX 完成数据访问代理数据迁移

更新时间:2020-05-13 11:10:09

数据访问代理通过集成 DataX,支持全量离线静态的数据迁移功能。DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现各种异构数据源之间高效的数据同步。目前,支持的源端数据源类型依赖于 DataX 支持的类型,而目标端仅支持 MySQL 和 OceanBase。

本文将介绍如何快速完成 MySQL 到数据访问代理的数据迁移。操作步骤如下:

  1. 前置条件
  2. 建库建表
  3. 创建迁移账户
  4. 配置连接参数
  5. 准备 DataX 环境
  6. 编辑并执行迁移 Job

操作步骤

前置条件

您已经开通数据访问代理产品并购买了数据访问代理实例,详见 创建实例

建库建表

  1. 登录数据访问代理控制台页面,选择 数据库,点击 创建数据库
  2. 在弹出的 创建数据库 窗口中,选择实例,点击 创建
  3. 进入 选择数据节点 页面后,根据需要选择 MySQL 或 OceanBase 的节点,点击 下一步
  4. 根据提示,填写或选择数据库的基本信息。详细参数信息,参见 创建数据访问代理数据库
  5. 数据库创建完成后,进入数据库详情页,点击右侧页面下方的 新增数据表
  6. 新增数据表 页面,输入 数据表名,如 test_migration_user
  7. 根据需要选择表类型(单表或拆分表),此处以 拆分表 为例,并设置 分表总数 为 2。
  8. 配置分表规则,详细配置方法可参见 创建数据访问代理数据表自定义分表规则
  9. 勾选 现在创建物理表,点击 下一步
  10. DDL 语句 中,输入建表语句,实例如下:
    1. CREATE TABLE `test_migration_user` (
    2. `user_id` varchar(16) NOT NULL,
    3. `username` varchar(64) NOT NULL,
    4. `id` bigint(20) NOT NULL AUTO_INCREMENT,
    5. PRIMARY KEY (`id`),
    6. UNIQUE KEY `uk_user_id` (`user_id`)
    7. ) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4;
  11. 点击 执行,完成建表。

创建迁移账户

  1. 在数据访问控制台页面,左侧导航栏选择 实例
  2. 在实例列表中,找到刚刚创建的数据库所在的实例,点击实例名称,进入实例详情页。
  3. 切换至 账号管理 页签,点击 创建账号
  4. 在弹出的新窗口中,输入数据库账号(必须是 odp_migrator)和账号密码,选择相应的授权数据库。
  5. 点击 确定,完成创建迁移账户。

配置连接参数

  1. 进入数据库详情页,选择页面下方的 连接参数 页签。
  2. 切换至 其他参数 后,在 connectionProperties 属性栏,输入以下属性值:
    1. rewriteBatchedStatements=true
  3. 点击底部 保存配置 按钮。

准备 DataX 环境

DataX 是一个异构数据源间数据迁移的中间件,支持各种类型的 reader 和 writer。要实现数据访问代理数据迁移,您需要准备 DataX 环境。

  1. 点击此处 下载 DataX,并将其解压至本地目录。
  2. 点击此处 下载 odpwriter 插件,并将其解压至 $datax_dir/plugin/writer 目录下。

说明:在从数据访问代理迁移至其他数据库的情况下,您需要下载 odpreader 插件,并将其解压至 $datax_dir/plugin/reader/ 目录下。

有关 DataX 的更多信息,参见 DataX 官方文档

编辑并执行迁移 Job

  1. 进入 $datax_dir/bin 目录,编写一份迁移 Job 描述文件。文件示例如下:
    1. {
    2. "job": {
    3. "setting": {
    4. "speed": {
    5. "channel": 3
    6. },
    7. "errorLimit": {
    8. "record": 0,
    9. "percentage": 0.02
    10. }
    11. },
    12. "content": [
    13. {
    14. "reader": {
    15. "name": "mysqlreader",
    16. "parameter": {
    17. "username": "$mysql_usr",
    18. "password": "$mysql_pwd",
    19. "column": [
    20. "user_id",
    21. "username"
    22. ],
    23. "splitPk": "id",
    24. "connection": [
    25. {
    26. "table": [
    27. "user"
    28. ],
    29. "jdbcUrl": [
    30. "jdbc:mysql://127.0.0.1:3306/test_migration"
    31. ]
    32. }
    33. ]
    34. }
    35. },
    36. "writer": {
    37. "name": "odpwriter",
    38. "parameter": {
    39. "writeMode": "replace",
    40. "username": "odp_migrator",
    41. "password": "$odp_pwd",
    42. "column": [
    43. "user_id",
    44. "username"
    45. ],
    46. "connection": [
    47. {
    48. "jdbcUrl": "jdbc:mysql://$dbp_url/test_migration?useUnicode=true&characterEncoding=utf8",
    49. "table": [
    50. "test_migration_user"
    51. ]
    52. }
    53. ]
    54. }
    55. }
    56. }
    57. ]
    58. }
    59. }
    根据以上 Job 描述文件,该数据迁移任务是将单库单表的 MySQL(127.0.0.1:3306)中的 test_migration 库里的 user 表的数据(列 user_idusername)迁移至 $dbp_url 中的 test_migration 库里的 test_migration_user 表(列 user_idusername)。
  2. Job 描述文件编写完成后,您需要在 $datax_dir/bin 目录下,执行下面以下命令,运行数据迁移 Job:
    1. python datax.py $yourjob.json
  3. 命令执行成功,即数据迁移完成。

注意事项

DataX 支持的数据类型

DataX 的 MysqlReader 针对 MySQL 类型转换列表如下:

DataX 内部类型 MySQL 数据类型
long int, tinyint, smallint, mediumint, int, bigint
Double float, double, decimal
String varchar, char, tinytext, text, mediumtext, longtext, year
Date date, datetime, timestamp, time
Boolean bit, bool
Bytes tinyblob, mediumblob, blob, longblob, varbinary

说明

  • 除上述字段类型外,其他类型均不支持。
  • 对于 tinyint(1),DataX 视为整型。
  • 对于 year,DataX 视为字符串类型。
  • 对于 bit,DataX 视为未定义行为。

数据迁移失败后重试,出现 Duplicate Key 问题。

在数据迁移过程中,可能存在部分数据写入失败的情况,此时需要进行重试。由于此时可能已经有部分数据已经完成迁移,重试的时候回出现 Duplicate Key 问题。此时,可以使用 DataX 的 REPLACE/INSERT IGNORE writeMode。

需要注意,REPLACE 语句的行为是如果发现主键或唯一键冲突,会将原来这条数据删除,然后重新插入,这样既可实现比较简单的出错重跑机制。REPLACE 语句可能会导致新的数据记录的自增 id 有变化,如果使用自增 id 进行关联,会出现问题。而 INSERT IGNORE 语句则不会有这个问题,如果发现主键或唯一键冲突,会忽略当前这条 SQL 的插入。