將本地表並行匯出至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
命令和匯出命令在同一個節點執行,才能查詢當前節點中匯出命令佔用的記憶體資源資訊。