全部产品
云市场

任务管理语句

更新时间:2019-09-18 15:57:36

任务管理语句是 DRDS 专有的扩展 SQL 语句,用于查看 DDL 任务的状态,恢复或回滚失败的 DDL 任务,等等。以下对任务管理语句的语法和用法逐一说明。

查看任务

  1. SHOW [FULL] DDL

查看当前处于 DDL 队列中的任务,查看到的 DDL 任务可能是正在执行的(处于非 PENDING 状态),也可能是失败挂起的(处于 PENDING 状态)。

注意:已经执行完处于 COMPLETED 状态的任务会被自动清理,无法通过 SHOW DDL 语句查看

参数 说明
FULL 显示 DDL 任务的所有信息,不带此参数则只显示常用信息

结果集中各字段的含义如下:

字段 含义
JOB_ID DDL 任务唯一标识,64位有符号长整型数值
PARENT_JOB_ID 该 DDL 任务的父任务唯一标识,独立无父任务时,该字段为0
SERVER 执行 DDL 任务的 DRDS 节点信息
OBJECT_SCHEMA DDL 任务对象的 Schema 名称,例如当前数据库名称
OBJECT_NAME DDL 任务对象名称,例如当前执行 DDL 的表名
NEW_OBJECT_NAME DDL 任务新对象名称,仅在 RENAME TABLE 时有效,表示目标表名
JOB_TYPE DDL 任务类型
PHASE DDL 任务当前所处的阶段
STATE DDL 任务当前所处的状态,PENDING 状态代表失败挂起,其它状态为执行中的状态
PROGRESS DDL 任务执行进度(百分比)
START_TIME DDL 任务开始执行的时间
END_TIME DDL 任务结束执行的时间
ELAPSED_TIME DDL 任务截止到任务查看时已经消耗的时间
DDL_STMT 原始的 DDL 语句
REMARK DDL 任务的备注信息,PENDING 状态时显示 DDL 任务失败的原因

示例:创建一个既分库又分表的拆分表,执行过程中查看状态

在一个连接上执行建表 DDL:

  1. mysql> create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64;

在另一个连接上查看 DDL 任务执行状态:

  1. mysql> show full ddl\G
  2. *************************** 1. row ***************************
  3. JOB_ID: 1103792075578957824
  4. PARENT_JOB_ID: 0
  5. SERVER: 1:102:10.81.69.55
  6. OBJECT_SCHEMA: ddltest
  7. OBJECT_NAME: test_mdb_mtb
  8. NEW_OBJECT_NAME:
  9. JOB_TYPE: CREATE_TABLE
  10. PHASE: EXECUTE
  11. STATE: RUNNING
  12. PROGRESS: 90%
  13. START_TIME: 2019-08-29 14:29:58.787
  14. END_TIME: 2019-08-29 14:30:07.177
  15. ELAPSED_TIME(MS): 8416
  16. DDL_STMT: create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64
  17. REMARK:

恢复任务

  1. RECOVER DDL { ALL | <job_id> [ , <job_id> ] ... }

恢复失败挂起(处于 PENDING 状态)的 DDL 任务。

注意:在恢复任务前,请通过 SHOW DDL 仔细查看任务中断或者失败的原因,排除导致 DDL 任务失败的因素后,再执行恢复任务的操作,否则恢复任务仍可能遭遇同样的问题导致失败

参数 说明
ALL 恢复所有处于 PENDING 状态的 DDL 任务,被恢复的任务会串行执行,请慎用此参数
job_id 通过 SHOW DDL 查看到的处于 PENDING 状态的任务 ID

示例:创建一个既分库又分表的拆分表,任务执行过程中被中断,通过 SHOW DDL 查看状态和 job_id,然后用 RECOVER DDL 恢复任务,直至该表创建完成

建表 DDL 任务在执行过程中被中断:

  1. mysql> create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64;
  2. ^C^C -- query aborted

查看 DDL 任务的信息,被中断的 DDL 任务处于 PENDING 状态:

  1. mysql> show ddl\G
  2. *************************** 1. row ***************************
  3. JOB_ID: 1103796219480006656
  4. OBJECT_SCHEMA: ddltest
  5. OBJECT_NAME: test_mdb_mtb
  6. JOB_TYPE: CREATE_TABLE
  7. PHASE: EXECUTE
  8. STATE: PENDING
  9. PROGRESS: 33%
  10. START_TIME: 2019-08-29 14:46:26.769
  11. END_TIME: 2019-08-29 14:46:29.691
  12. ELAPSED_TIME(MS): 2922
  13. DDL_STMT: create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64
  14. REMARK: The job has been interrupted unexpectedly

使用 RECOVER DDL 恢复该任务:

  1. mysql> recover ddl 1103796219480006656;
  2. Query OK, 0 rows affected (7.28 sec)

通过 CHECK TABLE 检查该表的一致性:

  1. mysql> check table test_mdb_mtb;
  2. +----------------------------------------+-------+----------+----------+
  3. | TABLE | OP | MSG_TYPE | MSG_TEXT |
  4. +----------------------------------------+-------+----------+----------+
  5. | ddltest_1562056402230oymk.test_mdb_mtb | check | status | OK |
  6. +----------------------------------------+-------+----------+----------+
  7. 1 row in set (2.24 sec)

回滚任务

  1. ROLLBACK DDL <job_id> [ , <job_id> ] ...

回滚失败挂起(处于 PENDING 状态)的 DDL 任务。

注意:目前仅对 CREATE TABLE 和 RENAME TABLE 两种类型的 DDL 任务支持回滚;对于其它不支持回滚的 DDL 任务,建议恢复任务后,再执行其它 DDL 操作

参数 说明
job_id 通过 SHOW DDL 查看到的处于 PENDING 状态的任务 ID

示例:创建一个既分库又分表的拆分表,任务执行过程中被中断,通过 SHOW DDL 查看状态和 job_id,然后用 ROLLBACK DDL 回滚任务

建表 DDL 任务在执行过程中被中断:

  1. mysql> create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64;
  2. ^C^C -- query aborted

查看 DDL 任务的信息,被中断的 DDL 任务处于 PENDING 状态:

  1. mysql> show ddl\G
  2. *************************** 1. row ***************************
  3. JOB_ID: 1103797850607083520
  4. OBJECT_SCHEMA: ddltest
  5. OBJECT_NAME: test_mdb_mtb
  6. JOB_TYPE: CREATE_TABLE
  7. PHASE: EXECUTE
  8. STATE: PENDING
  9. PROGRESS: 40%
  10. START_TIME: 2019-08-29 14:52:55.660
  11. END_TIME: 2019-08-29 14:52:58.885
  12. ELAPSED_TIME(MS): 3225
  13. DDL_STMT: create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64
  14. REMARK: The job has been interrupted unexpectedly

使用 ROLLBACK DDL 回滚该任务:

  1. mysql> rollback ddl 1103797850607083520;
  2. Query OK, 0 rows affected (6.42 sec)

回滚成功,该表不存在:

  1. mysql> show tables like 'test_mdb_mtb';
  2. Empty set (0.00 sec)

取消任务

  1. CANCEL DDL <job_id> [ , <job_id> ] ...

取消正在执行中(处于非 PENDING 状态)的 DDL 任务。

参数 说明
job_id 通过 SHOW DDL 查看到的处于 PENDING 状态的任务 ID

示例:创建一个既分库又分表的拆分表,任务执行过程中通过 CANCEL DDL 取消,通过 SHOW DDL 查看状态和 job_id,后续可以恢复或者回滚该任务

在一个连接上执行建表 DDL:

  1. mysql> create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64;

在另一个连接上通过 SHOW DDL 查看正在执行中的 DDL 任务:

  1. mysql> show ddl\G
  2. *************************** 1. row ***************************
  3. JOB_ID: 1103798959568478208
  4. OBJECT_SCHEMA: ddltest
  5. OBJECT_NAME: test_mdb_mtb
  6. JOB_TYPE: CREATE_TABLE
  7. PHASE: EXECUTE
  8. STATE: RUNNING
  9. PROGRESS: 26%
  10. START_TIME: 2019-08-29 14:57:20.058
  11. END_TIME: 2019-08-29 14:57:22.284
  12. ELAPSED_TIME(MS): 2243
  13. DDL_STMT: create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64
  14. REMARK:

执行 CANCEL DDL 取消这个 DDL 任务的执行:

  1. mysql> cancel ddl 1103798959568478208;
  2. Query OK, 2 rows affected (0.03 sec)

再通过 SHOW DDL 查看 DDL 任务状态,已被取消处于 PENDING 状态:

  1. mysql> show ddl\G
  2. *************************** 1. row ***************************
  3. JOB_ID: 1103798959568478208
  4. OBJECT_SCHEMA: ddltest
  5. OBJECT_NAME: test_mdb_mtb
  6. JOB_TYPE: CREATE_TABLE
  7. PHASE: EXECUTE
  8. STATE: PENDING
  9. PROGRESS: 87%
  10. START_TIME: 2019-08-29 14:57:20.058
  11. END_TIME: 2019-08-29 14:57:28.899
  12. ELAPSED_TIME(MS): 8841
  13. DDL_STMT: create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 64
  14. REMARK: ERR-CODE: [TDDL-4636][ERR_DDL_JOB_ERROR] The job '1103798959568478208' has been cancelled.

后续可以通过 RECOVER DDL 恢复任务,或者通过 ROLLBACK DDL 回滚任务,此处不再赘述。

删除任务

  1. REMOVE DDL { ALL { COMPLETED | PENDING } | <job_id> [ , <job_id> ] ... }

删除失败挂起(处于 PENDING 状态)的 DDL 任务,并清理对应的缓存。

注意:REMOVE DDL 删除任务的操作要非常谨慎;删除 PENDING 任务的操作执行后,有可能会暴露 DDL 执行过程中的中间状态,为后续进一步操作带来困扰。因此,在不确定 PENDING 任务是否可以安全删除时,请不要执行 REMOVE DDL 语句删除任务,应优先使用恢复或者回滚任务解除 PENDING 状态

参数 说明
ALL COMPLETED 删除所有处于 COMPLETED 或 STAGED 状态的任务,同时清理内部缓存
ALL PENDING 删除所有处于 PENDING 状态的任务,同时清理内部缓存
job_id 通过 SHOW DDL 查看到的处于 PENDING 状态的任务 ID

示例:数据库已有两张表,之间建立了参照完整性关系,当尝试删除父表时报错,因为存在参照完整性约束不允许删除,如果此时不想再执行删除表的操作,那么可以删除该 DDL 任务

数据库中存在两张具有参照完整性关系的父子表:

  1. mysql> show create table test_parent\G
  2. *************************** 1. row ***************************
  3. Table: test_parent
  4. Create Table: CREATE TABLE `test_parent` (
  5. `id` int(11) NOT NULL,
  6. `pkey` int(11) NOT NULL,
  7. `col` int(11) DEFAULT NULL,
  8. PRIMARY KEY (`id`,`pkey`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`id`)
  10. 1 row in set (0.01 sec)
  11. mysql> show create table test_child\G
  12. *************************** 1. row ***************************
  13. Table: test_child
  14. Create Table: CREATE TABLE `test_child` (
  15. `id` int(11) DEFAULT NULL,
  16. `parent_id` int(11) DEFAULT NULL,
  17. KEY `parent_id` (`parent_id`),
  18. CONSTRAINT `test_child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `test_parent` (`id`) ON DELETE CASCADE
  19. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`parent_id`)
  20. 1 row in set (0.02 sec)

因为存在参照完整性约束,尝试删除父表报错:

  1. mysql> drop table test_parent;
  2. ERROR 4636 (HY000): [f518265d0066000][10.81.69.55:3306][ddltest]ERR-CODE: [TDDL-4636][ERR_DDL_JOB_ERROR] Not all physical operations have been done successfully: expected 9,
  3. but done 0. Caused by: 1217:DDLTEST_1562056402230OYMK_7WW7_0007:Cannot delete or update a parent row: a foreign key constraint fails on `test_parent`;1217:DDLTEST_15620564022
  4. 30OYMK_7WW7_0000:Cannot delete or update a parent row: a foreign key constraint fails on `test_parent`;1217:DDLTEST_1562056402230OYMK_7WW7_0002:Cannot delete or update a pare
  5. nt row: a

查看 DDL 任务:

  1. mysql> show ddl\G
  2. *************************** 1. row ***************************
  3. JOB_ID: 1103806757547171840
  4. OBJECT_SCHEMA: ddltest
  5. OBJECT_NAME: test_parent
  6. JOB_TYPE: DROP_TABLE
  7. PHASE: EXECUTE
  8. STATE: PENDING
  9. PROGRESS: 0%
  10. START_TIME: 2019-08-29 15:28:19.240
  11. END_TIME: 2019-08-29 15:28:19.456
  12. ELAPSED_TIME(MS): 216
  13. DDL_STMT: drop table test_parent
  14. REMARK: ERR-CODE: [TDDL-4636][ERR_DDL_JOB_ERROR] Not all physical operations have been done successfully: expected 9, but done 0. Caused by: 1217:DDLTEST_1562056402
  15. 230OYMK_7WW7_0007:Cannot delete or update a parent row: a foreign key constraint fails on `test_pare ...

该 DDL 任务执行删除表的操作时,违反了参照完整性约束,因此删除操作并未真正执行,此时 CHECK TABLE 该表仍然是一致的:

  1. mysql> check table test_parent;
  2. +---------------------------------------+-------+----------+----------+
  3. | TABLE | OP | MSG_TYPE | MSG_TEXT |
  4. +---------------------------------------+-------+----------+----------+
  5. | ddltest_1562056402230oymk.test_parent | check | status | OK |
  6. +---------------------------------------+-------+----------+----------+
  7. 1 row in set (0.05 sec)

但由于该表上有 PENDING 状态的任务存在,因此此时表处于不可访问状态:

  1. mysql> show tables like 'test_parent';
  2. Empty set (0.00 sec)
  3. mysql> show create table test_parent;
  4. ERROR 4642 (HY000): [f5185a78b066000][10.81.69.55:3306][ddltest]ERR-CODE: [TDDL-4642][ERR_UNKNOWN_TABLE] Unknown table 'ddltest.test_parent'

此时该删除表的任务并没有真正开始执行,表结构仍然一致,虽然看似可以选择回滚失败的 DDL 操作,但由于 DROP TABLE 并不允许回滚,回滚操作并不可行,因此必须选择删除该失败的 DDL 任务:

  1. mysql> remove ddl 1103806757547171840;
  2. Query OK, 1 row affected (0.02 sec)

删除该 DDL 任务后,表恢复正常访问的状态:

  1. mysql> show tables like 'test_parent';
  2. +-------------------+
  3. | TABLES_IN_DDLTEST |
  4. +-------------------+
  5. | test_parent |
  6. +-------------------+
  7. 1 row in set (0.01 sec)