将本地表并行导出至OSS引擎可以极大地提升数据导出效率。本文介绍了将本地表并行导出至OSS引擎的相关内容。
使用限制
PolarDB MySQL版集群的产品版本需为企业版并满足以下版本要求:
8.0.1版本:修订版本需达到8.0.1.1.38或更高。
8.0.2版本:修订版本需达到8.0.2.2.25或更高。
仅支持并行导出单表查询的结果。不支持Join、Order By、Group By等多表查询和复杂查询的结果。
建议您在只读节点执行导出任务。您可以在SQL语句中添加HINT语法
/*FORCE_SALVE*/
或直接连接只读节点进行导出。
参数说明
参数名称 | 参数级别 | 参数说明 |
loose_oss_outfile_buffer_size | Global | 单个oss outfile线程可以占用的内存大小。一般情况下,占用的内存越大,导出速度越快。 取值范围:102400~536870912。默认值为134217728。单位为字节。 |
使用说明
语法
SELECT * FROM table_name INTO OSSOUTFILE 'outfile_path' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
COLUMNS TERMINATED BY
:表示每个字段之间的分隔符。OPTIONALLY ENCLOSED BY
:表示字段两端的标识符,加上OPTIONALLY后,只会在字符串类型的字段两端加标识符,否则会在所有类型的字段两端加标识符。NULL_MARKER BY
:表示NULL值输出到文本的字符。NULL的输出值有如下三种定义方式,优先级从高到低:NULL_MARKER:直接定义NULL的输出值,
NULL_MARKER
可以定义为任意值,优先级最高。ESCAPED BY:只能写单字符,NULL的输出值为字符+N。例如,
ESCAPED BY '\'
,则NULL会被输出为\N,优先级第二。NULL(默认):如果以上两者都没有,则默认NULL的输出值为字符串“NULL”,优先级最低。NULL的两端没有
ENCLOSED
标识符。
LINES TERMINATED BY:每一行之间的分隔符。
详情请参见MySQL官方文档。
参数说明
参数 | 说明 |
outfile_path | 主要标识输出到OSS的文件位置,包含如下几部分内容:
上述三者之间用 |
table_name | 表名称。 |
示例
您可以选择在SQL语句前添加HINT语法来并行导出数据。或开启弹性并行查询功能后,直接执行SQL语句来导出数据。开启并行查询功能的具体操作请参见概述。
此处以在SQL语句SELECT * FROM lineitem;
中添加HINT为例,介绍如何将本地表并行导出至OSS引擎。
执行以下命令,查看当前SQL语句是否可以并行执行。
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem;
执行结果如下:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5392844 | 100.00 | NULL | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1348211 | 100.00 | Parallel scan (4 workers) | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ 2 rows in set, 1 warning (0.05 sec)
若Extra列有Parallel scan,则表示当前SQL语句可以并行执行。
创建导出的OSS Server,此处以创建
outserver
为例。CREATE SERVER outserver FOREIGN DATA WRAPPER oss OPTIONS ( EXTRA_SERVER_INFO '{"oss_endpoint": "oss-cn-zhangjiakou.aliyuncs.com", "oss_bucket": "polardb", "oss_access_key_id": "*******", "oss_access_key_secret": "********", "oss_prefix":"B_outfile"}');
执行以下命令,查看并行导出的SQL语句的执行计划,以确定是否能将本地表并行导出至OSS引擎。
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
执行计划如下:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5805759 | 100.00 | Parallel export OSS outfile | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1451439 | 100.00 | Parallel scan (4 workers); Parallel export OSS outfile | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ 2 rows in set, 1 warning (0.03 sec)
若执行计划的Extra列中有
Parallel export OSS outfile
,则表示可以将本地表并行导出至OSS引擎。若执行计划中不支持并行导出。您可以通过以下方法查看原因:
将
OPTIMIZER_TRACE
参数设置为ON。SET optimizer_trace="enabled=on";
执行以下命令,查看并行导出的SQL语句的执行计划。
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem WHERE l_orderkey < 100 INTO OSSOUTFILE 'default_oss_server/t1' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
执行结果如下:
+----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 105 | 100.00 | NULL | | 1 | SIMPLE | lineitem | NULL | range | PRIMARY,i_l_orderkey | PRIMARY | 4 | NULL | 26 | 100.00 | Parallel scan (4 workers); Using where | +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+ 2 rows in set, 1 warning (0.00 sec)
执行以下命令,查看并行导出的SQL语句的Optimizer Trace。
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
执行结果如下:
``` "considered_parallel_outfile": { "choose": false, "storage": "OSS", "format": "CSV", "mean_outfile_record_length": "79 B", "estimate_single_worker_outfile_size": "8 KB", "cause": "The data written by each worker should be greater than 1024 KB (pq_oss_min_worker_write_size)." } } ```
您可以在执行结果的
cause
参数值中查看不能并行导出的原因。
执行以下命令,将本地表并行导出至OSS引擎。
SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
导出过程中,您可以通过以下命令查看当前导出任务实时占用的总内存数和总线程数。
查看导出任务实时占用的总内存数,单位为字节。
SHOW STATUS LIKE "%Oss_outfile_memory_used%";
查看导出任务实时占用的总线程数。
SHOW STATUS LIKE "%Oss_outfile_threads_running%";
说明当您连接集群地址执行导出任务时,必须保证
SHOW STATUS
命令和导出命令在同一个节点执行,才能查询当前节点中导出命令占用的内存资源信息。