异步提交导出任务

更新时间:
复制为 MD 格式

AnalyticDB for MySQL支持通过异步方式提交数据导出任务。

应用场景

在使用INSERT INTOINSERT OVERWRITE INTO SELECT导出数据时,默认是同步执行流程,当数据量较大达到几百GB,客户端到AnalyticDB for MySQL服务端的连接会中断,导致数据导出失败。因此,在数据量较大的场景,推荐通过异步方式提交数据导出任务。

异步提交任务

语法

  • 基础语法

    SUBMIT JOB INSERT OVERWRITE table_name select_statement;
  • 增强语法。

    在提交任务时指定别名。

    SUBMIT JOB <job_alias_name> AS <query_body>;
    • 唯一性:别名必须唯一,由用户自行保证。

    • 格式:类型为字符串,两侧不添加单引号或双引号。

    • 字符集:仅支持字母、数字和下划线

    • 长度:最长 128 位。

示例

  • 提交异步任务

    SUBMIT JOB INSERT OVERWRITE test SELECT * FROM test_external_table;

    执行上述语句后,返回job_id。使用job_id可以查询异步任务的状态。

    +---------------------------------------+
    | job_id                                |
    +---------------------------------------+
    | 2017112122202917203100908203303000715 |
  • 提交异步任务并指定任务别名

    • 正确示例

      SUBMIT JOB test_123 AS INSERT INTO test SELECT * FROM test_external_table;
    • 错误示例

      任务别名两侧不能添加单引号或双引号。

      SUBMIT JOB 'test_123' AS INSERT INTO test SELECT * FROM test_external_table;
      SUBMIT JOB "test_123" AS INSERT INTO test SELECT * FROM test_external_table;

设置优先级调度

3.1.3.6及以上版本支持优先级调度。在SQL语句前添加Hint/*+async_job_priority=n*/ 可以指定异步任务的优先级。默认优先级值为1,值越大表示优先级越高,会被系统优先调度。

/*+async_job_priority=10*/ SUBMIT JOB INSERT OVERWRITE test SELECT * FROM test_external_table;

查询异步任务状态

语法

  • 使用job_id查询

    SHOW JOB STATUS WHERE job_id='job_id';
  • 使用任务别名查询

    SHOW JOB STATUS WHERE job_name='job_alias_name';

示例

SHOW JOB STATUS WHERE job_id='2017112122202917203100908203303000715';

返回结果如下:

+-------------------------------------------+-------------+-----------+--------------+-----------+----------+-------------------------+-------------------------+---------------------------------------------------+-------------------------------------------+------------+----------+------------+-------------+------------+------------------+------------------------+
| job_id                                    | schema_name | status    | process_rows | fail_rows | fail_msg | create_time             | update_time             | definition                                        | exec_job_id                               | total_rows | progress | start_time | result_rows | result_url | query_priority   | user_define_job_name   |
+-------------------------------------------+-------------+-----------+--------------+-----------+----------+-------------------------+-------------------------+---------------------------------------------------+-------------------------------------------+------------+----------+------------+-------------+------------+------------------+------------------------+
| 2026022710213902101709304503151000743     | test_db     | SUCCEEDED |            4 |         0 | NULL     | 2026-02-27 10:21:39.0   | 2026-02-27 10:21:45.0   | INSERT INTO test SELECT * FROM test_external_table| 2026022710214402101706516803151005717     |          0 | NULL     | NULL       |           0 | NULL       | NORMAL           | test_123               |
+-------------------------------------------+-------------+-----------+--------------+-----------+----------+-------------------------+-------------------------+---------------------------------------------------+-------------------------------------------+------------+----------+------------+-------------+------------+------------------+------------------------+
说明

不同内核版本的集群返回的字段不同,建议您根据返回结果中的status字段解析异步任务状态。

任务状态及映射关系

数仓版任务状态

湖仓版任务状态

说明

INIT

SUBMITTING

异步任务已提交。

SUBMITTED

RUNNING

异步任务执行中。

RUNNING

FINISH

SUCCEEDED

异步任务执行成功。

FAILED

FAILED

异步任务执行失败。

CANCELLED

异步任务取消执行。

说明
  • CANCELLED为新增的异步任务状态,数仓版中无映射关系。

终止任务

说明

  • 未调度起来的任务和已完成(失败或成功)的任务会被移除队列。

  • 正在运行的任务被终止,已导入的数据可能会被回滚,建议手动删除残留数据。

  • 不支持直接通过任务别名user_define_job_name终止任务,您可以通过任务别名查询job_id,使用job_id终止任务。

语法

CANCEL JOB 'job_id';

示例

CANCEL JOB '2017112122202917203100908203303000715';