TiDB Data Migration 查询任务状态

本文介绍 TiDB Data Migration (DM) query-status 命令的查询结果、任务状态与子任务状态。

查询结果

1. » query-status
1. {
2. "result": true,     # 查询是否成功
3. "msg": "",          # 查询失败原因描述
4. "tasks": [          # 迁移 task 列表
5. {
6. "taskName": "test",         # 任务名称
7. "taskStatus": "Running",    # 任务运行状态
8. "sources": [                # 该任务的上游 MySQL 列表
9. "mysql-replica-01",
10. "mysql-replica-02"
11. ]
12. },
13. {
14. "taskName": "test2",
15. "taskStatus": "Paused",
16. "sources": [
17. "mysql-replica-01",
18. "mysql-replica-02"
19. ]
20. }
21. ]
22. }

关于 tasks 下的 taskStatus 状态的详细定义,请参阅任务状态。

推荐的 query-status 使用方法是:

  1. 首先使用 query-status 查看各个 task 的运行状态是否正常。
  2. 如果发现其中某一 task 状态有问题,通过 query-status <出错任务的 taskName> 来得到更详细的错误信息。

任务状态

DM 的迁移任务状态取决于其分配到 DM-worker 上的子任务状态,定义见下表:

任务对应的所有子任务的状态 任务状态
任一子任务处于 “Paused” 状态且返回结果有错误信息 Error - Some error occurred in subtask
任一处于 Sync 阶段的子任务处于 “Running” 状态但其 Relay 处理单元未运行(处于 Error/Paused/Stopped 状态) Error - Relay status is Error/Paused/Stopped
任一子任务处于 “Paused” 状态且返回结果没有错误信息 Paused
所有子任务处于 “New” 状态 New
所有子任务处于 “Finished” 状态 Finished
所有子任务处于 “Stopped” 状态 Stopped
其他情况 Running

详情查询结果

1. » query-status test
1. {
2. "result": true,     # 查询是否成功
3. "msg": "",          # 查询失败原因描述
4. "sources": [        # 上游 MySQL 列表
5. {
6. "result": true,
7. "msg": "",
8. "sourceStatus": {                   # 上游 MySQL 的信息
9. "source": "mysql-replica-01",
10. "worker": "worker1",
11. "result": null,
12. "relayStatus": null
13. },
14. "subTaskStatus": [              # 上游 MySQL 所有子任务的信息
15. {
16. "name": "test",         # 子任务名称
17. "stage": "Running",     # 子任务运行状态,包括 “New”,“Running”,“Paused”,“Stopped” 以及 “Finished”
18. "unit": "Sync",         # DM 的处理单元,包括 “Check”,“Dump“,“Load” 以及 “Sync”
19. "result": null,         # 子任务失败时显示错误信息
20. "unresolvedDDLLockID": "test-`test`.`t_target`",    # sharding DDL lock ID,可用于异常情况下手动处理 sharding DDL lock
21. "sync": {                   # 当前 `Sync` 处理单元的迁移信息
22. "masterBinlog": "(bin.000001, 3234)",                               # 上游数据库当前的 binlog position
23. "masterBinlogGtid": "c0149e17-dff1-11e8-b6a8-0242ac110004:1-14",    # 上游数据库当前的 GTID 信息
24. "syncerBinlog": "(bin.000001, 2525)",                               # 已被 `Sync` 处理单元迁移的 binlog position
25. "syncerBinlogGtid": "",                                             # 使用 GTID 迁移的 binlog position
26. "blockingDDLs": [       # 当前被阻塞的 DDL 列表。该项仅在当前 DM-worker 所有上游表都处于 “synced“ 状态时才有数值,此时该列表包含的是待执行或待跳过的 sharding DDL 语句
27. "USE `test`; ALTER TABLE `test`.`t_target` DROP COLUMN `age`;"
28. ],
29. "unresolvedGroups": [   # 没有被解决的 sharding group 信息
30. {
31. "target": "`test`.`t_target`",                  # 待迁移的下游表
32. "DDLs": [
33. "USE `test`; ALTER TABLE `test`.`t_target` DROP COLUMN `age`;"
34. ],
35. "firstPos": "(bin|000001.000001, 3130)",        # sharding DDL 语句起始 binlog position
36. "synced": [                                     # `Sync` 处理单元已经读到该 sharding DDL 的上游分表
37. "`test`.`t2`"
38. "`test`.`t3`"
39. "`test`.`t1`"
40. ],
41. "unsynced": [                                   # `Sync` 处理单元未读到该 sharding DDL 的上游分表。如有上游分表未完成同步,`blockingDDLs` 为空
42. ]
43. }
44. ],
45. "synced": false,        # 增量复制是否已追上上游。由于后台 `Sync` 单元并不会实时刷新保存点,当前值为 `false` 并不一定代表发生了迁移延迟
46. "totalRows": "12",      # 该子任务中迁移的行数
47. "totalRps": "1",        # 该子任务中每秒迁移的行数
48. "recentRps": "1"        # 该子任务中最后一秒迁移的行数
49. }
50. }
51. ]
52. },
53. {
54. "result": true,
55. "msg": "",
56. "sourceStatus": {
57. "source": "mysql-replica-02",
58. "worker": "worker2",
59. "result": null,
60. "relayStatus": null
61. },
62. "subTaskStatus": [
63. {
64. "name": "test",
65. "stage": "Running",
66. "unit": "Load",
67. "result": null,
68. "unresolvedDDLLockID": "",
69. "load": {                                  # `Load` 处理单元的迁移信息
70. "finishedBytes": "115",                # 已全量导入的字节数
71. "totalBytes": "452",                   # 总计需要导入的字节数
72. "progress": "25.44 %",                 # 全量导入进度
73. "bps": "2734"                          # 全量导入速度
74. }
75. }
76. ]
77. },
78. {
79. "result": true,
80. "sourceStatus": {
81. "source": "mysql-replica-03",
82. "worker": "worker3",
83. "result": null,
84. "relayStatus": null
85. },
86. "subTaskStatus": [
87. {
88. "name": "test",
89. "stage": "Paused",
90. "unit": "Load",
91. "result": {                 # 错误示例
92. "isCanceled": false,
93. "errors": [
94. {
95. "Type": "ExecSQL",
96. "msg": "Error 1062: Duplicate entry '1155173304420532225' for key 'PRIMARY'\n/home/jenkins/workspace/build_dm/go/src/github.com/pingcap/tidb-enterprise-tools/loader/db.go:160: \n/home/jenkins/workspace/build_dm/go/src/github.com/pingcap/tidb-enterprise-tools/loader/db.go:105: \n/home/jenkins/workspace/build_dm/go/src/github.com/pingcap/tidb-enterprise-tools/loader/loader.go:138: file test.t1.sql"
97. }
98. ],
99. "detail": null
100. },
101. "unresolvedDDLLockID": "",
102. "load": {
103. "finishedBytes": "0",
104. "totalBytes": "156",
105. "progress": "0.00 %",
106. "bps": "0"
107. }
108. }
109. ]
110. },
111. {
112. "result": true,
113. "msg": "",
114. "sourceStatus": {
115. "source": "mysql-replica-04",
116. "worker": "worker4",
117. "result": null,
118. "relayStatus": null
119. },
120. "subTaskStatus": [
121. {
122. "name": "test",
123. "stage": "Running",
124. "unit": "Dump",
125. "result": null,
126. "unresolvedDDLLockID": "",
127. "dump": {                        # `Dump` 处理单元的迁移信息
128. "totalTables": "10",         # 需要 dump 的表数量
129. "completedTables": "3",      # 已 dump 的表数量
130. "finishedBytes": "2542",     # 已 dump 的字节数
131. "finishedRows": "32",        # 已 dump 的行数
132. "estimateTotalRows": "563",  # 预估需要 dump 的行数
133. "progress": "30.52 %",       # dump 的进度
134. "bps": "445"                 # dump 的速度
135. }
136. }
137. ]
138. },
139. ]
140. }

关于 sources 下 subTaskStatus 中 stage 状态和状态转换关系的详细信息,请参阅子任务状态。

关于 sources 下 subTaskStatus 中 unresolvedDDLLockID的操作细节,请参阅手动处理 Sharding DDL Lock。

子任务状态

状态描述

  • New:

  • 初始状态。

  • 如果子任务没有发生错误,状态切换为 Running,其他情况则切换为 Paused。
  • Running:正常运行状态。
  • Paused:

  • 暂停状态。

  • 子任务发生错误,状态切换为 Paused。
  • 如在子任务为 Running 状态下执行 pause-task 命令,任务状态会切换为 Paused。
  • 如子任务处于该状态,可以使用 resume-task 命令恢复任务。
  • Stopped:

  • 停止状态。

  • 如在子任务为 Running 或 Paused 状态下执行 stop-task 命令,任务状态会切换为 Stopped。
  • 如子任务处于该状态,不可使用 resume-task 命令恢复任务。
  • Finished:

  • 任务完成状态。

  • 只有 task-mode 为 full 的任务正常完成后,任务才会切换为该状态。

状态转换图

1. error occurs
2. New --------------------------------|
3. |                                  |
4. |           resume-task            |
5. |  |----------------------------|  |
6. |  |                            |  |
7. |  |                            |  |
8. v  v        error occurs        |  v
9. Finished <-------------- Running -----------------------> Paused
10. ^  |        or pause-task       |
11. |  |                            |
12. start task |  | stop task                  |
13. |  |                            |
14. |  v        stop task           |
15. Stopped <-------------------------|