ジョブ管理ステートメントは、PolarDB-X 1.0専用の拡張された構造化クエリ言語 (SQL) ステートメントです。 データ定義言語 (DDL) ジョブの詳細を照会し、失敗したDDLジョブを再開またはロールバックするために使用できます。 このトピックでは、ジョブ管理ステートメントの構文と使用方法について説明します。
ジョブの照会
構文ショー [FULL] DDLパラメーター 説明 フル DDLジョブのすべての情報を照会します。 このパラメーターを指定しない場合は、次の共通情報だけが表示されます。 - JOB_ID
- OBJECT_SCHEMA
- OBJECT_NAME
- JOB_TYPE
- フェーズ
- 州
- 進歩
- START_TIME
- END_TIME
- ELAPSED_TIME
- コメント
- PHY_PROCESS
- BACKFILL_PROGRESS
- 結果セット内のフィールドの説明
フィールド 説明 JOB_ID DDLジョブの一意のID。 これは、長い64ビット符号付き整数である。 PARENT_JOB_ID DDL親ジョブの一意のID。 これは、長い64ビット符号付き整数である。 説明 親ジョブが存在しない場合、このフィールドは0に設定される。サーバー DDLジョブを実行するDRDSサーバーノードの情報。 OBJECT_SCHEMA DDLジョブに対応するオブジェクトのスキーマ名。 例えば、このフィールドは、現在のデータベースの名前とすることができる。 OBJECT_NAME DDLジョブに対応するオブジェクトの名前。 たとえば、このフィールドには、現在のDDLステートメントが実行されるテーブルの名前を指定できます。 NEW_OBJECT_NAME DDLジョブに対応するオブジェクトの新しい名前。 説明 このフィールドは、RENAME TABLEを実行した場合にのみ有効です。 ターゲットテーブル名を示します。JOB_TYPE DDLジョブのタイプ。 フェーズ DDLジョブが配置されているフェーズ。 州 DDLジョブのステータス。 進歩 DDLジョブの進行状況。 START_TIME DDLジョブの実行が開始された時刻。 END_TIME DDLジョブの実行が終了した時刻。 ELAPSED_TIME DDLジョブの実行が終了してからの経過時間。 単位:ミリ秒。 DDL_STMT 元のDDLステートメント。 コメント DDLジョブの備考。 説明 このフィールドには、DDLジョブがPENDING状態の場合のDDLジョブの失敗原因が表示されます。 - 例:
データベースシャード内のテーブルシャードに分割された論理テーブルを作成します。 ジョブの実行中にジョブの詳細を照会します。
- 接続でCREATE TABLE 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) tbpartition 64; - 別の接続のDDLジョブの詳細を照会します。
mysql> ddl\Gをフル表示 *************************** 1。 行 *************************** JOB_ID: 1103792075578957824 PARENT_JOB_ID: 0 サーバー: 1:102:10.81.69.55 OBJECT_SCHEMA: ddltest OBJECT_NAME: test_mdb_mtb NEW_OBJECT_NAME: JOB_TYPE: CREATE_TABLE フェーズ: 実行 州: 実行中 進歩: 90% START_TIME: 2019-08-29 14:29b 58.787 END_TIME: 2019-08-29 14:30:07。177 ELAPSED_TIME(MS): 8416 DDL_STMT: テーブルtest_mdb_mtbを作成します (c1 int not null auto_incrementプライマリキー、c2 varchar(10) 、c3 date) dbpartition by hash(c1) tbpartition 64 コメント:
- 接続でCREATE TABLE DDLステートメントを実行します。
仕事を再開する
- 構文
RECOVER DDL { ALL | <job_id> [ , <job_id> ] ... }パラメーター 説明 すべて PENDING状態にあるすべてのDDLジョブを再開します。 このパラメータにより、保留中のDDLジョブがシリアルに実行されることに注意してください。 このコマンドは慎重にご使用ください。 job_id 保留中のDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。 - 例:
データベースシャード内のテーブルシャードに分割された論理テーブルを作成し、実行中にジョブを中断します。 SHOW DDL文を実行して、ジョブのステータスと
job_idを照会します。 次に、RECOVER DDL文を実行して、テーブルが作成されるまでジョブを再開します。- 実行中にCREATE TABLE DDLジョブを中断します。
mysql> テーブルtest_mdb_mtbを作成します (c1 int not null auto_incrementプライマリキー、c2 varchar(10) 、c3 date) dbpartition by hash(c1) tbpartition 64; ^ C ^ C -- クエリが中止されました - DDLジョブに関する情報を照会します。 中断されたDDLジョブはPENDING状態です。
中断されましたmysql> show ddl\G *************************** 1。 行 *************************** JOB_ID: 1103796219480006656 OBJECT_SCHEMA: ddltest OBJECT_NAME: test_mdb_mtb JOB_TYPE: CREATE_TABLE フェーズ: 実行 州: 保留中 進歩: 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: テーブルtest_mdb_mtbを作成します (c1 int not null auto_incrementプライマリキー、c2 varchar(10) 、c3 date) dbpartition by hash(c1) tbpartition 64 注意: ジョブが予期せず - RECOVER DDL文を実行して、ジョブを再開します。
mysql> ddl 1103796219480006656を回復します。クエリOK、影響を受ける0行 (7.28秒) - CHECK TABLEを実行して、テーブルの整合性を確認します。
mysql> チェックテーブルtest_mdb_mtb; + ---------------------------------------- + ------------------------------ + | テーブル | OP | MSG_TYPE | MSG_TEXT | + ---------------------------------------- + ------------------------------ + | ddltest_1562056402230oymk.test_mdb_mtb | チェック | ステータス | OK | + ---------------------------------------- + ------------------------------ + 1行セット (2.24秒)
- 実行中にCREATE TABLE DDLジョブを中断します。
ジョブをロールバックする
- 構文
ROLLBACK DDL <job_id> [ , <job_id> ] ...パラメーター 説明 job_id 保留中のDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。 - 例:
データベースシャード内のテーブルシャードに分割された論理テーブルを作成し、実行中にジョブを中断します。 SHOW DDL文を実行して、ジョブのステータスと
job_idを照会します。 次に、ROLLBACK DDLステートメントを実行して、ジョブをロールバックします。- 実行中にCREATE TABLE DDLジョブを中断します。
mysql> テーブルtest_mdb_mtbを作成します (c1 int not null auto_incrementプライマリキー、c2 varchar(10) 、c3 date) dbpartition by hash(c1) tbpartition 64; ^ C ^ C -- クエリが中止されました - DDLジョブに関する情報を照会します。 中断されたDDLジョブはPENDING状態です。
中断されましたmysql> show ddl\G *************************** 1。 行 *************************** JOB_ID: 1103797850607083520 OBJECT_SCHEMA: ddltest OBJECT_NAME: test_mdb_mtb JOB_TYPE: CREATE_TABLE フェーズ: 実行 州: 保留中 進歩: 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: テーブルtest_mdb_mtbを作成します (c1 int not null auto_incrementプライマリキー、c2 varchar(10) 、c3 date) dbpartition by hash(c1) tbpartition 64 注意: ジョブが予期せず - ROLLBACK DDL文を実行して、ジョブをロールバックします。
mysql> ロールバックddl 1103797850607083520; クエリOK、影響を受ける0行 (6.42秒) - ロールバックは成功しました。 テーブルが存在しません。
mysql> 'test_mdb_mtb 'のようなテーブルを表示します。空セット (0.00秒)
- 実行中にCREATE TABLE DDLジョブを中断します。
ジョブのキャンセル
PENDING状態でない実行中のDDLジョブをキャンセルできます。
- 構文
キャンセルDDL <job_id> [ , <job_id> ] ...パラメーター 説明 job_id 保留状態になっていないDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。 - 例:
データベースシャード内のテーブルシャードに分割された論理テーブルを作成します。 CANCEL DDL文を実行してジョブをキャンセルする。 SHOW DDL文を実行して、ジョブのステータスと
job_idを照会します。 後で、ジョブを再開またはロールバックできます。- 接続でCREATE TABLE 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) tbpartition 64; - 別の接続でSHOW DDLステートメントを実行して、実行中のDDLジョブの情報を照会します。
mysql> show ddl\G *************************** 1。 行 *************************** JOB_ID: 1103798959568478208 OBJECT_SCHEMA: ddltest OBJECT_NAME: test_mdb_mtb JOB_TYPE: CREATE_TABLE フェーズ: 実行 州: 実行中 進歩: 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: テーブルtest_mdb_mtbを作成します (c1 int not null auto_incrementプライマリキー、c2 varchar(10) 、c3 date) dbpartition by hash(c1) tbpartition 64 コメント: - CANCEL DDL文を実行して、DDLジョブの実行をキャンセルします。
mysql> ddl 1103798959568478208をキャンセルします。クエリOK、影響を受ける2行 (0.03秒) - SHOW DDLステートメントを実行して、DDLジョブのステータスを照会します。 DDLジョブはキャンセルされており、保留状態になっています。
mysql> show ddl\G *************************** 1。 行 *************************** JOB_ID: 1103798959568478208 OBJECT_SCHEMA: ddltest OBJECT_NAME: test_mdb_mtb JOB_TYPE: CREATE_TABLE フェーズ: 実行 州: 保留中 進歩: 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: テーブルtest_mdb_mtbを作成します (c1 int not null auto_incrementプライマリキー、c2 varchar(10) 、c3 date) dbpartition by hash(c1) tbpartition 64 REMARK: ERR-CODE: [TDDL-4636][ERR_DDL_JOB_ERROR] ジョブ「1103798959568478208」がキャンセルされました。
- 接続でCREATE TABLE DDLステートメントを実行します。
ジョブの削除
- 構文
REMOVE DDL { ALL PENDING | <job_id> [ , <job_id> ] ... }パラメーター 説明 すべての保留中 PENDING状態にあるすべてのジョブを削除し、内部キャッシュをクリアします。 job_id 保留中のDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。 - 例:
データベースに2つのテーブルが存在し、2つのテーブル間に参照整合性関係が確立されていると仮定する。 親テーブルを削除しようとすると、参照整合性制約のあるテーブルは削除できないため、エラーが報告されます。 この場合、テーブルを削除したくない場合は、DDLジョブを削除できます。
- データベースで、参照整合性関係を持つ2つの親子テーブルを作成します。
mysql> show create table test_parent\G *************************** 1。 行 *************************** テーブル: test_parent テーブルの作成: Create Table 'test_parent' ( 'id' int (11) NOT NULL, 'pkey' int (11) NOT NULL, 'col' int(11) DEFAULT NULL、プライマリーキー ('id','pkey') ) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('id') セットの1列 (0.01秒) mysql> show create table test_child\G *************************** 1。 行 *************************** テーブル: test_child テーブルの作成: 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 ('parent_id') 1行セット (0.02秒) - 親テーブルの削除を試みます。 参照整合性の制約により、エラーが報告される。
mysql> ドロップテーブルtest_parent; エラー4636 (HY000): [f518265d0066000][10.81.69.55:3306][ddltest]ERR-CODE: [TDDL-4636][ERR_DDL_JOB_ERROR] すべての物理操作が正常に行われたわけではありません: 予想9、しかし行われた0。 原因: 1217:DDLTEST_1562056402230OYMK_7WW7_0007: 親行を削除または更新できません: 外部キー制約が 'test_parent' で失敗します。1217:DDLTEST_15620564022 30OYMK_7WW7_0000: 親行を削除または更新できません: 外部キー制約が 'test_parent' で失敗します。1217: pareを削除または更新できません nt row: a - DDLジョブを照会します。
mysql> show ddl\G *************************** 1。 行 *************************** JOB_ID: 1103806757547171840 OBJECT_SCHEMA: ddltest OBJECT_NAME: test_parent JOB_TYPE: DROP_TABLE フェーズ: 実行 州: 保留中 進歩: 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: ドロップテーブルtest_parent REMARK: ERR-CODE: [TDDL-4636][ERR_DDL_JOB_ERROR] すべての物理操作が成功したわけではありません。 原因: 1217:DDLTEST_1562056402 230OYMK_7WW7_0007: 親行を削除または更新できません。外部キーの制約が 'test_pare... - テーブルを削除しようとすると、DDLジョブは参照整合性制約に違反します。 その結果、削除操作は失敗します。 この時点で、CHECK TABLEを実行すると、テーブルに一貫性があることがわかります。
mysql> チェックテーブルtest_parent; + --------------------------------------- + ------------------------------ + | テーブル | OP | MSG_TYPE | MSG_TEXT | + --------------------------------------- + ------------------------------ + | ddltest_1562056402230oymk.test_parent | チェック | ステータス | OK | + --------------------------------------- + ------------------------------ + 1行セット (0.05秒) - ただし、テーブルに保留中のジョブが存在するため、テーブルにアクセスできません。
mysql> 'test_parent' のようなテーブルを表示します。空セット (0.00秒) mysql> show create table test_parent; エラー4642 (HY000): [f5185a78b066000][10.81.69.55:3306][ddltest]ERR-CODE: [TDDL-4642][ERR_UNKNOWN_TABLE] 不明なテーブル 'ddltest.test_parent ' - この場合、テーブル削除ジョブは実行されず、テーブル構造は一貫しています。 失敗したDDL操作をロールバックすることを選択できるようです。 ただし、DROP TABLEステートメントではロールバック操作はできません。 したがって、失敗したDDLジョブの削除を選択する必要があります。
mysql> ddl 1103806757547171840を削除します。クエリOK、影響を受ける1行 (0.02秒) - DDLジョブが削除されると、テーブルはアクセス可能になります。
mysql> 'test_parent' のようなテーブルを表示します。+ ------------------- + | TABLES_IN_DDLTEST | + ------------------- + | test_parent | + ------------------- + 1行セット (0.01秒)
- データベースで、参照整合性関係を持つ2つの親子テーブルを作成します。