任务管理语句
任务管理语句是 DRDS 专有的扩展 SQL 语句,用于查看 DDL 任务的状态,恢复或回滚失败的 DDL 任务,等等。以下对任务管理语句的语法和用法逐一说明。
查看任务
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:
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 任务执行状态:
mysql> show full ddl\G
*************************** 1. row ***************************
JOB_ID: 1103792075578957824
PARENT_JOB_ID: 0
SERVER: 1:102:10.81.69.55
OBJECT_SCHEMA: ddltest
OBJECT_NAME: test_mdb_mtb
NEW_OBJECT_NAME:
JOB_TYPE: CREATE_TABLE
PHASE: EXECUTE
STATE: RUNNING
PROGRESS: 90%
START_TIME: 2019-08-29 14:29:58.787
END_TIME: 2019-08-29 14:30:07.177
ELAPSED_TIME(MS): 8416
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
REMARK:
恢复任务
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 任务在执行过程中被中断:
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;
^C^C -- query aborted
查看 DDL 任务的信息,被中断的 DDL 任务处于 PENDING 状态:
mysql> show ddl\G
*************************** 1. row ***************************
JOB_ID: 1103796219480006656
OBJECT_SCHEMA: ddltest
OBJECT_NAME: test_mdb_mtb
JOB_TYPE: CREATE_TABLE
PHASE: EXECUTE
STATE: PENDING
PROGRESS: 33%
START_TIME: 2019-08-29 14:46:26.769
END_TIME: 2019-08-29 14:46:29.691
ELAPSED_TIME(MS): 2922
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
REMARK: The job has been interrupted unexpectedly
使用 RECOVER DDL 恢复该任务:
mysql> recover ddl 1103796219480006656;
Query OK, 0 rows affected (7.28 sec)
通过 CHECK TABLE 检查该表的一致性:
mysql> check table test_mdb_mtb;
+----------------------------------------+-------+----------+----------+
| TABLE | OP | MSG_TYPE | MSG_TEXT |
+----------------------------------------+-------+----------+----------+
| ddltest_1562056402230oymk.test_mdb_mtb | check | status | OK |
+----------------------------------------+-------+----------+----------+
1 row in set (2.24 sec)
回滚任务
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 任务在执行过程中被中断:
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;
^C^C -- query aborted
查看 DDL 任务的信息,被中断的 DDL 任务处于 PENDING 状态:
mysql> show ddl\G
*************************** 1. row ***************************
JOB_ID: 1103797850607083520
OBJECT_SCHEMA: ddltest
OBJECT_NAME: test_mdb_mtb
JOB_TYPE: CREATE_TABLE
PHASE: EXECUTE
STATE: PENDING
PROGRESS: 40%
START_TIME: 2019-08-29 14:52:55.660
END_TIME: 2019-08-29 14:52:58.885
ELAPSED_TIME(MS): 3225
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
REMARK: The job has been interrupted unexpectedly
使用 ROLLBACK DDL 回滚该任务:
mysql> rollback ddl 1103797850607083520;
Query OK, 0 rows affected (6.42 sec)
回滚成功,该表不存在:
mysql> show tables like 'test_mdb_mtb';
Empty set (0.00 sec)
取消任务
CANCEL DDL <job_id> [ , <job_id> ] ...
取消正在执行中(处于非 PENDING 状态)的 DDL 任务。
参数 | 说明 |
---|---|
job_id | 通过 SHOW DDL 查看到的处于 PENDING 状态的任务 ID |
示例:创建一个既分库又分表的拆分表,任务执行过程中通过 CANCEL DDL 取消,通过 SHOW DDL 查看状态和 job_id,后续可以恢复或者回滚该任务
在一个连接上执行建表 DDL:
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 任务:
mysql> show ddl\G
*************************** 1. row ***************************
JOB_ID: 1103798959568478208
OBJECT_SCHEMA: ddltest
OBJECT_NAME: test_mdb_mtb
JOB_TYPE: CREATE_TABLE
PHASE: EXECUTE
STATE: RUNNING
PROGRESS: 26%
START_TIME: 2019-08-29 14:57:20.058
END_TIME: 2019-08-29 14:57:22.284
ELAPSED_TIME(MS): 2243
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
REMARK:
执行 CANCEL DDL 取消这个 DDL 任务的执行:
mysql> cancel ddl 1103798959568478208;
Query OK, 2 rows affected (0.03 sec)
再通过 SHOW DDL 查看 DDL 任务状态,已被取消处于 PENDING 状态:
mysql> show ddl\G
*************************** 1. row ***************************
JOB_ID: 1103798959568478208
OBJECT_SCHEMA: ddltest
OBJECT_NAME: test_mdb_mtb
JOB_TYPE: CREATE_TABLE
PHASE: EXECUTE
STATE: PENDING
PROGRESS: 87%
START_TIME: 2019-08-29 14:57:20.058
END_TIME: 2019-08-29 14:57:28.899
ELAPSED_TIME(MS): 8841
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
REMARK: ERR-CODE: [TDDL-4636][ERR_DDL_JOB_ERROR] The job '1103798959568478208' has been cancelled.
后续可以通过 RECOVER DDL 恢复任务,或者通过 ROLLBACK DDL 回滚任务,此处不再赘述。
删除任务
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 任务
数据库中存在两张具有参照完整性关系的父子表:
mysql> show create table test_parent\G
*************************** 1. row ***************************
Table: test_parent
Create Table: CREATE TABLE `test_parent` (
`id` int(11) NOT NULL,
`pkey` int(11) NOT NULL,
`col` int(11) DEFAULT NULL,
PRIMARY KEY (`id`,`pkey`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`id`)
1 row in set (0.01 sec)
mysql> show create table test_child\G
*************************** 1. row ***************************
Table: test_child
Create Table: CREATE TABLE `test_child` (
`id` int(11) DEFAULT NULL,
`parent_id` int(11) DEFAULT NULL,
KEY `parent_id` (`parent_id`),
CONSTRAINT `test_child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `test_parent` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`parent_id`)
1 row in set (0.02 sec)
因为存在参照完整性约束,尝试删除父表报错:
mysql> drop table test_parent;
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,
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
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
nt row: a
查看 DDL 任务:
mysql> show ddl\G
*************************** 1. row ***************************
JOB_ID: 1103806757547171840
OBJECT_SCHEMA: ddltest
OBJECT_NAME: test_parent
JOB_TYPE: DROP_TABLE
PHASE: EXECUTE
STATE: PENDING
PROGRESS: 0%
START_TIME: 2019-08-29 15:28:19.240
END_TIME: 2019-08-29 15:28:19.456
ELAPSED_TIME(MS): 216
DDL_STMT: drop table test_parent
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
230OYMK_7WW7_0007:Cannot delete or update a parent row: a foreign key constraint fails on `test_pare ...
该 DDL 任务执行删除表的操作时,违反了参照完整性约束,因此删除操作并未真正执行,此时 CHECK TABLE 该表仍然是一致的:
mysql> check table test_parent;
+---------------------------------------+-------+----------+----------+
| TABLE | OP | MSG_TYPE | MSG_TEXT |
+---------------------------------------+-------+----------+----------+
| ddltest_1562056402230oymk.test_parent | check | status | OK |
+---------------------------------------+-------+----------+----------+
1 row in set (0.05 sec)
但由于该表上有 PENDING 状态的任务存在,因此此时表处于不可访问状态:
mysql> show tables like 'test_parent';
Empty set (0.00 sec)
mysql> show create table test_parent;
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 任务:
mysql> remove ddl 1103806757547171840;
Query OK, 1 row affected (0.02 sec)
删除该 DDL 任务后,表恢复正常访问的状态:
mysql> show tables like 'test_parent';
+-------------------+
| TABLES_IN_DDLTEST |
+-------------------+
| test_parent |
+-------------------+
1 row in set (0.01 sec)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论