管理数据同步任务

本文介绍了如何使用 dmctl 组件来进行数据同步任务的管理和维护。对于用 DM-Ansible 部署的 DM 集群,dmctl 二进制文件路径为 dm-ansible/dmctl

dmctl 基本用法

本部分描述了一些 dmctl 命令的基本用法。

dmctl 使用帮助

  1. $ ./dmctl --help
  2. Usage of dmctl:
  3. # 打印版本信息
  4. -V prints version and exit
  5. # 按照 DM 提供的加密方法加密数据库密码,用于 DM 的配置文件
  6. -encrypt string
  7. encrypt plaintext to ciphertext
  8. # DM-master 访问地址,dmctl 与 DM-master 交互以完成任务管理操作
  9. -master-addr string
  10. master API server addr

加密数据库密码

在 DM 相关配置文件中,要求必须使用经 dmctl 加密后的密码,否则会报错。对于同一个原始密码,每次加密后密码不同。

  1. $ ./dmctl -encrypt 123456
  2. VjX8cEeTX+qcvZ3bPaO4h0C80pe/1aU=

任务管理概览

  1. # 进入命令行模式,与 DM-master 进行交互
  2. $ ./dmctl -master-addr 172.16.30.14
  3. Welcome to dmctl
  4. Release Version: v1.0.0-100-g2bef6f8b
  5. Git Commit Hash: 2bef6f8beda34c0dff57377005c71589b48aa3c5
  6. Git Branch: dm-master
  7. UTC Build Time: 2018-11-02 10:03:18
  8. Go Version: go version go1.11 linux/amd64
  9. » help
  10. DM control
  11. Usage:
  12. dmctl [command]
  13. Available Commands:
  14. break-ddl-lock force to break DM-worker's DDL lock
  15. generate-task-config generate a task config with config file
  16. help Help about any command
  17. pause-relay pause DM-worker's relay unit
  18. pause-task pause a running task with name
  19. query-status query task's status
  20. refresh-worker-tasks refresh worker -> tasks mapper
  21. resume-relay resume DM-worker's relay unit
  22. resume-task resume a paused task with name
  23. show-ddl-locks show un-resolved DDL locks
  24. sql-inject sql-inject injects (limited) sqls into syncer as binlog event
  25. sql-replace sql-replace replaces sql in specific binlog_pos with other sqls, each sql must ends with semicolon;
  26. sql-skip sql-skip skips specified binlog position
  27. start-task start a task with config file
  28. stop-task stop a task with name
  29. switch-relay-master switch master server of DM-worker's relay unit
  30. unlock-ddl-lock force to unlock DDL lock
  31. update-master-config update configure of DM-master
  32. update-task update a task's config for routes, filters, column-mappings, black-white-list
  33. Flags:
  34. -h, --help help for dmctl
  35. -w, --worker strings DM-worker ID
  36. # 使用 `dmctl [command] --help` 来获取某个命令的更多信息

管理数据同步任务

本部分描述了如何使用不同的任务管理命令来执行以下操作:

创建数据同步任务

start-task 命令用于创建数据同步任务。 当数据同步任务启动时,DM 将自动对相应权限和配置进行前置检查

  1. » help start-task
  2. start a task with config file
  3. Usage:
  4. dmctl start-task [-w worker ...] <config_file> [flags]
  5. Flags:
  6. -h, --help help for start-task
  7. Global Flags:
  8. -w, --worker strings dm-worker ID

命令用法示例

  1. start-task [ -w "172.16.30.15:10081"] ./task.yaml

参数解释

  • -w
    • 可选
    • 指定在特定的一组 DM-workers 上执行 task.yaml
    • 如果设置,则只启动指定任务在该组 DM-workers 上的子任务
  • config_file
    • 必选
    • 指定 task.yaml 的文件路径

返回结果示例

  1. » start-task task.yaml
  2. {
  3. "result": true,
  4. "msg": "",
  5. "workers": [
  6. {
  7. "result": true,
  8. "worker": "172.16.30.15:10081",
  9. "msg": ""
  10. },
  11. {
  12. "result": true,
  13. "worker": "172.16.30.16:10081",
  14. "msg": ""
  15. }
  16. ]
  17. }

查询数据同步任务状态

query-status 命令用于查询数据同步任务状态。有关查询结果及子任务状态,详见查询状态

  1. » help query-status
  2. query task's status
  3. Usage:
  4. dmctl query-status [-w worker ...] [task_name] [flags]
  5. Flags:
  6. -h, --help help for query-status
  7. Global Flags:
  8. -w, --worker strings dm-worker ID

命令用法示例

  1. query-status

参数解释

  • -w
    • 可选
    • 查询在指定的一组 DM-workers 上运行的数据同步任务的子任务
  • task_name
    • 可选
    • 指定任务名称
    • 如果未设置,则返回全部数据同步任务的查询结果

返回结果示例

有关查询结果中各参数的意义,详见查询状态结果

  1. » query-status
  2. {
  3. "result": true,
  4. "msg": "",
  5. "workers": [
  6. {
  7. "result": true,
  8. "worker": "172.16.30.15:10081",
  9. "msg": "",
  10. "subTaskStatus": [
  11. {
  12. "name": "test",
  13. "stage": "Running",
  14. "unit": "Sync",
  15. "result": null,
  16. "unresolvedDDLLockID": "",
  17. "sync": {
  18. "TotalEvents": "0",
  19. "TotalTps": "0",
  20. "RecentTps": "0",
  21. "MasterBinlog": "(mysql-bin.000004, 484)",
  22. "MasterBinlogGtid": "",
  23. "SyncerBinlog": "(mysql-bin.000004, 484)",
  24. "SyncerBinlogGtid": "",
  25. "blockingDDLs": [
  26. ],
  27. "unresolvedGroups": [
  28. ]
  29. }
  30. }
  31. ],
  32. "relayStatus": {
  33. "MasterBinlog": "(mysql-bin.000004, 484)",
  34. "MasterBinlogGtid": "",
  35. "relaySubDir": "0-1.000001",
  36. "RelayBinlog": "(mysql-bin.000004, 484)",
  37. "RelayBinlogGtid": "",
  38. "relayCatchUpMaster": true,
  39. "stage": "Running",
  40. "result": null
  41. }
  42. },
  43. {
  44. "result": true,
  45. "worker": "172.16.30.16:10081",
  46. "msg": "",
  47. "subTaskStatus": [
  48. {
  49. "name": "test",
  50. "stage": "Running",
  51. "unit": "Sync",
  52. "result": null,
  53. "unresolvedDDLLockID": "",
  54. "sync": {
  55. "TotalEvents": "0",
  56. "TotalTps": "0",
  57. "RecentTps": "0",
  58. "MasterBinlog": "(mysql-bin.000004, 4809)",
  59. "MasterBinlogGtid": "",
  60. "SyncerBinlog": "(mysql-bin.000004, 4809)",
  61. "SyncerBinlogGtid": "",
  62. "blockingDDLs": [
  63. ],
  64. "unresolvedGroups": [
  65. ]
  66. }
  67. }
  68. ],
  69. "relayStatus": {
  70. "MasterBinlog": "(mysql-bin.000004, 4809)",
  71. "MasterBinlogGtid": "",
  72. "relaySubDir": "0-1.000001",
  73. "RelayBinlog": "(mysql-bin.000004, 4809)",
  74. "RelayBinlogGtid": "",
  75. "relayCatchUpMaster": true,
  76. "stage": "Running",
  77. "result": null
  78. }
  79. }
  80. ]
  81. }

暂停数据同步任务

pause-task 命令用于暂停数据同步任务。

  1. » help pause-task
  2. pause a running task with name
  3. Usage:
  4. dmctl pause-task [-w worker ...] <task_name> [flags]
  5. Flags:
  6. -h, --help help for pause-task
  7. Global Flags:
  8. -w, --worker strings DM-worker ID

命令用法示例

  1. pause-task [-w "127.0.0.1:10181"] task-name

参数解释

  • -w
    • 可选
    • 指定在特定的一组 DM-workers 上暂停数据同步任务的子任务
    • 如果设置,则只暂停该任务在指定 DM-workers 上的子任务
  • task_name
    • 必选
    • 指定任务名称

返回结果示例

  1. » pause-task test
  2. {
  3. "op": "Pause",
  4. "result": true,
  5. "msg": "",
  6. "workers": [
  7. {
  8. "op": "Pause",
  9. "result": true,
  10. "worker": "172.16.30.15:10081",
  11. "msg": ""
  12. },
  13. {
  14. "op": "Pause",
  15. "result": true,
  16. "worker": "172.16.30.16:10081",
  17. "msg": ""
  18. }
  19. ]
  20. }

恢复数据同步任务

resume-task 命令用于恢复数据同步任务。

  1. » help resume-task
  2. resume a paused task with name
  3. Usage:
  4. dmctl resume-task [-w worker ...] <task_name> [flags]
  5. Flags:
  6. -h, --help help for resume-task
  7. Global Flags:
  8. -w, --worker strings dm-worker ID

命令用法示例

  1. resume-task [-w "127.0.0.1:10181"] task-name

参数解释

  • -w
    • 可选
    • 指定在特定的一组 DM-workers 上恢复数据同步任务的子任务
    • 如果设置,则只恢复该任务在指定 DM-workers 上的子任务
  • task_name
    • 必选
    • 指定任务名称

返回结果示例

  1. » resume-task test
  2. {
  3. "op": "Resume",
  4. "result": true,
  5. "msg": "",
  6. "workers": [
  7. {
  8. "op": "Resume",
  9. "result": true,
  10. "worker": "172.16.30.15:10081",
  11. "msg": ""
  12. },
  13. {
  14. "op": "Resume",
  15. "result": true,
  16. "worker": "172.16.30.16:10081",
  17. "msg": ""
  18. }
  19. ]
  20. }

停止数据同步任务

stop-task 命令用于停止数据同步任务。

  1. » help stop-task
  2. stop a task with name
  3. Usage:
  4. dmctl stop-task [-w worker ...] <task_name> [flags]
  5. Flags:
  6. -h, --help help for stop-task
  7. Global Flags:
  8. -w, --worker strings dm-worker ID

命令用法示例

  1. stop-task [-w "127.0.0.1:10181"] task-name

参数解释

  • -w
    • 可选
    • 指定在特定的一组 DM-workers 上停止数据同步任务的子任务
    • 如果设置,则只停止该任务在指定 DM-workers 上的子任务
  • task_name
    • 必选
    • 指定任务名称

返回结果示例

  1. » stop-task test
  2. {
  3. "op": "Stop",
  4. "result": true,
  5. "msg": "",
  6. "workers": [
  7. {
  8. "op": "Stop",
  9. "result": true,
  10. "worker": "172.16.30.15:10081",
  11. "msg": ""
  12. },
  13. {
  14. "op": "Stop",
  15. "result": true,
  16. "worker": "172.16.30.16:10081",
  17. "msg": ""
  18. }
  19. ]
  20. }

更新数据同步任务

update-task 命令用于更新数据同步任务。

支持的更新项包括:

  • 表路由规则
  • 表黑白名单规则
  • binlog 过滤规则
  • 列值转换规则

其余项均不支持更新。

支持更新项的更新步骤

  1. 使用 query-status <task-name> 查询对应数据同步任务的状态。

    • stage 不为 Paused,则先使用 pause-task <task-name> 暂停任务。
  2. task.yaml 文件中更新需要修改的自定义配置或者错误配置。

  3. 使用 update-task task.yaml 更新任务配置。

  4. 使用 resume-task <task-name> 恢复任务。

不支持更新项的更新步骤

  1. 使用 query-status <task-name> 查询对应数据同步任务的状态。

    • 若任务存在,则通过 stop-task <task-name> 停止任务。
  2. task.yaml 文件中更新需要修改的自定义配置或者错误配置。

  3. 使用 start-task <task-name> 恢复任务。

  1. » help update-task
  2. update a task's config for routes, filters, column-mappings, black-white-list
  3. Usage:
  4. dmctl update-task [-w worker ...] <config_file> [flags]
  5. Flags:
  6. -h, --help help for update-task
  7. Global Flags:
  8. -w, --worker strings dm-worker ID

命令用法示例

  1. update-task [-w "127.0.0.1:10181"] ./task.yaml

参数解释

  • -w
    • 可选
    • 指定在特定的一组 DM-workers 上更新数据同步任务的子任务
    • 如果设置,则只更新指定 DM-workers 上的子任务配置
  • config_file
    • 必选
    • 指定 task.yaml 的文件路径

返回结果示例

  1. » update-task task_all_black.yaml
  2. {
  3. "result": true,
  4. "msg": "",
  5. "workers": [
  6. {
  7. "result": true,
  8. "worker": "172.16.30.15:10081",
  9. "msg": ""
  10. },
  11. {
  12. "result": true,
  13. "worker": "172.16.30.16:10081",
  14. "msg": ""
  15. }
  16. ]
  17. }

管理 DDL lock

详见手动处理 sharding DDL lock

强制刷新 task => DM-workers 映射关系

refresh-worker-tasks 命令用于强制刷新 DM-master 内存中维护的 task => DM-workers 映射关系。

注意:

一般不需要使用此命令。仅当已确定 task => DM-workers 映射关系存在,但执行其它命令时仍提示必须刷新它时,你才需要使用此命令。