Job management statements are extended Structured Query Language (SQL) statements dedicated to PolarDB-X 1.0. They can be used to query the details of data definition language (DDL) jobs and resume or roll back failed DDL jobs. This topic describes the syntax and usage of job management statements.
Query a job
- Syntax
SHOW [FULL] DDL
Parameter Description FULL Queries all information of a DDL job. If you do not specify this parameter, only the following common information is displayed. - JOB_ID
- OBJECT_SCHEMA
- OBJECT_NAME
- JOB_TYPE
- PHASE
- STATE
- PROGRESS
- START_TIME
- END_TIME
- ELAPSED_TIME
- REMARK
- PHY_PROCESS
- BACKFILL_PROGRESS
- Description of the fields in the result set
Field Description JOB_ID The unique ID of the DDL job. It is a long 64-bit signed integer. PARENT_JOB_ID The unique ID of the DDL parent job. It is a long 64-bit signed integer. Note If no parent job exists, this field is set to 0.SERVER The information of the DRDS server node that executes the DDL job. OBJECT_SCHEMA The schema name of the object corresponding to the DDL job. For example, this field can be the name of the current database. OBJECT_NAME The name of the object corresponding to the DDL job. For example, this field can be the name of the table where the current DDL statement is executed. NEW_OBJECT_NAME The new name of the object corresponding to the DDL job. Note This field is valid only when you execute RENAME TABLE. It indicates the target table name.JOB_TYPE The type of the DDL job. PHASE The phase where the DDL job is located. STATE The status of the DDL job. PROGRESS The progress of the DDL job. START_TIME The time when the execution of the DDL job started. END_TIME The time when the execution of the DDL job ended. ELAPSED_TIME The time elapsed after the execution of the DDL job ended. Unit: milliseconds. DDL_STMT The original DDL statement. REMARK The remarks of the DDL job. Note This field displays the failure cause of the DDL job when the DDL job is in the PENDING state. - Example
Create a logical table that is partitioned into table shards in a database shard. Query the details of the job when the job is being executed.
- Execute the CREATE TABLE DDL statement on a connection.
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;
- Query the details of the DDL job on another connection.
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:
- Execute the CREATE TABLE DDL statement on a connection.
Resume a job
- Syntax
RECOVER DDL { ALL | <job_id> [ , <job_id> ] ... }
Parameter Description ALL Resumes all DDL jobs that are in the PENDING state. Note that this parameter causes the pending DDL jobs to be executed serially. Use it with caution. job_id The ID of the pending DDL job. This ID is displayed in the execution result of the SHOW DDL statement. - Example
Create a logical table that is partitioned into table shards in a database shard and interrupt the job during execution. Execute the SHOW DDL statement to query the status and
job_id
of the job. Then, execute the RECOVER DDL statement to resume the job until the table is created.- Interrupt the CREATE TABLE DDL job during execution.
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
- Query the information about the DDL job. The interrupted DDL job is in the PENDING
state.
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
- Execute the RECOVER DDL statement to resume the job.
mysql> recover ddl 1103796219480006656; Query OK, 0 rows affected (7.28 sec)
- Execute CHECK TABLE to check the consistency of the 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)
- Interrupt the CREATE TABLE DDL job during execution.
Roll back a job
- Syntax
ROLLBACK DDL <job_id> [ , <job_id> ] ...
Parameter Description job_id The ID of the pending DDL job. This ID is displayed in the execution result of the SHOW DDL statement. - Example
Create a logical table that is partitioned into table shards in a database shard and interrupt the job during execution. Execute the SHOW DDL statement to query the status and
job_id
of the job. Then, execute the ROLLBACK DDL statement to roll back the job.- Interrupt the CREATE TABLE DDL job during execution.
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
- Query the information about the DDL job. The interrupted DDL job is in the PENDING
state.
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
- Execute the ROLLBACK DDL statement to roll back the job.
mysql> rollback ddl 1103797850607083520; Query OK, 0 rows affected (6.42 sec)
- Rollback is successful. The table does not exist.
mysql> show tables like 'test_mdb_mtb'; Empty set (0.00 sec)
- Interrupt the CREATE TABLE DDL job during execution.
Cancel a job
You can cancel a running DDL job that is not in the PENDING state.
- Syntax
CANCEL DDL <job_id> [ , <job_id> ] ...
Parameter Description job_id The ID of the DDL job that is not in the PENDING state. This ID is displayed in the execution result of the SHOW DDL statement. - Example
Create a logical table that is partitioned into table shards in a database shard. Execute the CANCEL DDL statement to cancel the job. Execute the SHOW DDL statement to query the status and
job_id
of the job. Later, you can resume or roll back the job.- Execute the CREATE TABLE DDL statement on a connection.
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;
- Query the information of the running DDL job by executing the SHOW DDL statement on
another connection.
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:
- Execute the CANCEL DDL statement to cancel the execution of the DDL job.
mysql> cancel ddl 1103798959568478208; Query OK, 2 rows affected (0.03 sec)
- Execute the SHOW DDL statement to query the status of the DDL job. The DDL job has
been canceled and is in the PENDING state.
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.
- Execute the CREATE TABLE DDL statement on a connection.
Delete a job
- Syntax
REMOVE DDL { ALL PENDING | <job_id> [ , <job_id> ] ... }
Parameter Description ALL PENDING Deletes all jobs that are in the PENDING state and clears internal caches. job_id The ID of the pending DDL job. This ID is displayed in the execution result of the SHOW DDL statement. - Example
Assume that two tables exist in the database and a referential integrity relationship is established between the two tables. When you attempt to delete the parent table, an error is reported because tables with the referential integrity constraint cannot be deleted. In this case, if you do not want another attempt to delete the table, you can delete the DDL job.
- In the database, create two parent-child tables with the referential integrity relationship.
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)
- Attempt to delete the parent table. Due to the referential integrity constraint, an
error is reported.
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
- Query the DDL job.
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 ...
- The DDL job violates the referential integrity constraint when you attempt to delete
the table. As a result, the delete operation fails. At this time, if you execute CHECK
TABLE, you can see that the table is still consistent.
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)
- However, the table is inaccessible because a pending job exists for the table.
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'
- In this case, the table deletion job is not executed and the table structure is still
consistent. It seems that you can choose to roll back the failed DDL operation. However,
the DROP TABLE statement does not allow rollback operations. Therefore, you must choose
to delete the failed DDL job.
mysql> remove ddl 1103806757547171840; Query OK, 1 row affected (0.02 sec)
- After the DDL job is deleted, the table recovers to be accessible.
mysql> show tables like 'test_parent'; +-------------------+ | TABLES_IN_DDLTEST | +-------------------+ | test_parent | +-------------------+ 1 row in set (0.01 sec)
- In the database, create two parent-child tables with the referential integrity relationship.