すべてのプロダクト
Search
ドキュメントセンター

PolarDB:仕事管理ステートメント

最終更新日:May 28, 2024

ジョブ管理ステートメントは、PolarDB-X 1.0専用の拡張された構造化クエリ言語 (SQL) ステートメントです。 データ定義言語 (DDL) ジョブの詳細を照会し、失敗したDDLジョブを再開またはロールバックするために使用できます。 このトピックでは、ジョブ管理ステートメントの構文と使用方法について説明します。

ジョブの照会

DDLキュー内のDDLジョブの詳細を照会できます。この場合、DDLジョブは実行中の非PENDING状態であるか、失敗によりPENDING状態である可能性があります。
説明 実行されたジョブは完了状態になり、自動的にクリアされます。 SHOW DDLステートメントを実行してこれらのジョブを照会することはできません。
  • ショー [FULL] DDL
    構文
    パラメーター説明
    フルDDLジョブのすべての情報を照会します。 このパラメーターを指定しない場合は、次の共通情報だけが表示されます。
    • JOB_ID
    • OBJECT_SCHEMA
    • OBJECT_NAME
    • JOB_TYPE
    • フェーズ
    • 進歩
    • START_TIME
    • END_TIME
    • ELAPSED_TIME
    • コメント
    • PHY_PROCESS
    • BACKFILL_PROGRESS
  • 結果セット内のフィールドの説明
    フィールド説明
    JOB_IDDDLジョブの一意のID。 これは、長い64ビット符号付き整数である。
    PARENT_JOB_IDDDL親ジョブの一意のID。 これは、長い64ビット符号付き整数である。
    説明 親ジョブが存在しない場合、このフィールドは0に設定される。
    サーバーDDLジョブを実行するDRDSサーバーノードの情報。
    OBJECT_SCHEMADDLジョブに対応するオブジェクトのスキーマ名。 例えば、このフィールドは、現在のデータベースの名前とすることができる。
    OBJECT_NAMEDDLジョブに対応するオブジェクトの名前。 たとえば、このフィールドには、現在のDDLステートメントが実行されるテーブルの名前を指定できます。
    NEW_OBJECT_NAMEDDLジョブに対応するオブジェクトの新しい名前。
    説明 このフィールドは、RENAME TABLEを実行した場合にのみ有効です。 ターゲットテーブル名を示します。
    JOB_TYPEDDLジョブのタイプ。
    フェーズDDLジョブが配置されているフェーズ。
    DDLジョブのステータス。
    進歩DDLジョブの進行状況。
    START_TIMEDDLジョブの実行が開始された時刻。
    END_TIMEDDLジョブの実行が終了した時刻。
    ELAPSED_TIMEDDLジョブの実行が終了してからの経過時間。 単位:ミリ秒。
    DDL_STMT元のDDLステートメント。
    コメントDDLジョブの備考。
    説明 このフィールドには、DDLジョブがPENDING状態の場合のDDLジョブの失敗原因が表示されます。
  • 例:

    データベースシャード内のテーブルシャードに分割された論理テーブルを作成します。 ジョブの実行中にジョブの詳細を照会します。

    1. 接続で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;
    2. 別の接続の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
          コメント: 

仕事を再開する

失敗のために中断された保留中のDDLジョブを再開できます。
説明 ジョブを再開する前に、SHOW DDL文を実行して、中断または障害の原因を確認してください。 失敗の原因が解消された後にのみジョブを再開します。 それ以外の場合、ジョブを再開しようとすると同じ問題が発生します。
  • 構文
    RECOVER DDL { ALL | <job_id> [ , <job_id> ] ... }
    パラメーター説明
    すべてPENDING状態にあるすべてのDDLジョブを再開します。 このパラメータにより、保留中のDDLジョブがシリアルに実行されることに注意してください。 このコマンドは慎重にご使用ください。
    job_id保留中のDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。
  • 例:

    データベースシャード内のテーブルシャードに分割された論理テーブルを作成し、実行中にジョブを中断します。 SHOW DDL文を実行して、ジョブのステータスとjob_idを照会します。 次に、RECOVER DDL文を実行して、テーブルが作成されるまでジョブを再開します。

    1. 実行中に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 -- クエリが中止されました 
    2. 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
           注意: ジョブが予期せず
      中断されました
    3. RECOVER DDL文を実行して、ジョブを再開します。
      mysql> ddl 1103796219480006656を回復します。クエリOK、影響を受ける0行 (7.28秒) 
    4. CHECK TABLEを実行して、テーブルの整合性を確認します。
      mysql> チェックテーブルtest_mdb_mtb;
      + ---------------------------------------- + ------------------------------ +
      | テーブル | OP | MSG_TYPE | MSG_TEXT |
      + ---------------------------------------- + ------------------------------ +
      | ddltest_1562056402230oymk.test_mdb_mtb | チェック | ステータス | OK |
      + ---------------------------------------- + ------------------------------ +
      1行セット (2.24秒) 

ジョブをロールバックする

失敗のために中断された保留中のDDLジョブをロールバックできます。
説明 CREATE TABLEおよびRENAME TABLE DDLジョブのみロールバックできます。 ロールバックできない他のDDLジョブの場合は、他のDDL操作を実行する前に、保留中のDDLジョブを再開することをお勧めします。
  • 構文
    ROLLBACK DDL <job_id> [ , <job_id> ] ...
    パラメーター説明
    job_id保留中のDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。
  • 例:

    データベースシャード内のテーブルシャードに分割された論理テーブルを作成し、実行中にジョブを中断します。 SHOW DDL文を実行して、ジョブのステータスとjob_idを照会します。 次に、ROLLBACK DDLステートメントを実行して、ジョブをロールバックします。

    1. 実行中に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 -- クエリが中止されました 
    2. 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
           注意: ジョブが予期せず
      中断されました
    3. ROLLBACK DDL文を実行して、ジョブをロールバックします。
      mysql> ロールバックddl 1103797850607083520;
      クエリOK、影響を受ける0行 (6.42秒) 
    4. ロールバックは成功しました。 テーブルが存在しません。
      mysql> 'test_mdb_mtb 'のようなテーブルを表示します。空セット (0.00秒) 

ジョブのキャンセル

PENDING状態でない実行中のDDLジョブをキャンセルできます。

  • 構文
    キャンセルDDL <job_id> [ , <job_id> ] ...
    パラメーター説明
    job_id保留状態になっていないDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。
  • 例:

    データベースシャード内のテーブルシャードに分割された論理テーブルを作成します。 CANCEL DDL文を実行してジョブをキャンセルする。 SHOW DDL文を実行して、ジョブのステータスとjob_idを照会します。 後で、ジョブを再開またはロールバックできます。

    1. 接続で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;
    2. 別の接続で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
         コメント: 
    3. CANCEL DDL文を実行して、DDLジョブの実行をキャンセルします。
      mysql> ddl 1103798959568478208をキャンセルします。クエリOK、影響を受ける2行 (0.03秒) 
    4. 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」がキャンセルされました。

ジョブの削除

障害のために中断された保留中のDDLジョブを削除し、対応するキャッシュをクリアできます。
警告 REMOVE DDLを実行してDDLジョブを削除することに注意してください。 保留中のジョブを削除すると、DDL実行中の中間状態が公開され、後続の操作に障害が発生します。 したがって、保留中のジョブを安全に削除できるかどうかわからない場合は、REMOVE DDL文を実行してジョブを削除しないでください。 好ましくは、ジョブを再開またはロールバックして、ジョブを最初にPENDING状態にすることができる。
  • 構文
    REMOVE DDL { ALL PENDING | <job_id> [ , <job_id> ] ... }
    パラメーター説明
    すべての保留中PENDING状態にあるすべてのジョブを削除し、内部キャッシュをクリアします。
    job_id保留中のDDLジョブのID。 このIDはSHOW DDL文の実行结果に表示されます。
  • 例:

    データベースに2つのテーブルが存在し、2つのテーブル間に参照整合性関係が確立されていると仮定する。 親テーブルを削除しようとすると、参照整合性制約のあるテーブルは削除できないため、エラーが報告されます。 この場合、テーブルを削除したくない場合は、DDLジョブを削除できます。

    1. データベースで、参照整合性関係を持つ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秒) 
    2. 親テーブルの削除を試みます。 参照整合性の制約により、エラーが報告される。
      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 
    3. 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... 
    4. テーブルを削除しようとすると、DDLジョブは参照整合性制約に違反します。 その結果、削除操作は失敗します。 この時点で、CHECK TABLEを実行すると、テーブルに一貫性があることがわかります。
      mysql> チェックテーブルtest_parent;
      + --------------------------------------- + ------------------------------ +
      | テーブル | OP | MSG_TYPE | MSG_TEXT |
      + --------------------------------------- + ------------------------------ +
      | ddltest_1562056402230oymk.test_parent | チェック | ステータス | OK |
      + --------------------------------------- + ------------------------------ +
      1行セット (0.05秒) 
    5. ただし、テーブルに保留中のジョブが存在するため、テーブルにアクセスできません。
      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 ' 
    6. この場合、テーブル削除ジョブは実行されず、テーブル構造は一貫しています。 失敗したDDL操作をロールバックすることを選択できるようです。 ただし、DROP TABLEステートメントではロールバック操作はできません。 したがって、失敗したDDLジョブの削除を選択する必要があります。
      mysql> ddl 1103806757547171840を削除します。クエリOK、影響を受ける1行 (0.02秒) 
    7. DDLジョブが削除されると、テーブルはアクセス可能になります。
      mysql> 'test_parent' のようなテーブルを表示します。+ ------------------- +
      | TABLES_IN_DDLTEST |
      + ------------------- +
      | test_parent |
      + ------------------- +
      1行セット (0.01秒)