您可以通過PolarDB提供的OSSOUTFILE功能,將本地的數據文件導出為CSV文件,并存儲在OSS引擎上。
前提條件
PolarDB集群版本需為如下版本之一:
PolarDB MySQL版8.0.2版本且Revision version為8.0.2.2.8或以上。
PolarDB MySQL版8.0.1版本且Revision version為8.0.1.1.30或以上。
您可以參見查詢版本號確認集群版本。
注意事項
參數說明
參數 | 說明 |
loose_oss_outfile_buffer_size | 每個oss outfile線程可以占用的內存大小。取值范圍:102400~536870912。默認值為134217728。單位:Byte。一般占用內存越大,導出速度越快。 |
loose_max_oss_outfile_threads | PolarDB可以同時啟動的oss outfile線程數量。取值范圍:1~100。默認值為1。單位:個。 您可以使用 說明 集群版本為PolarDB MySQL版8.0.1.1.38及以上的版本時,該參數已失效。 |
使用OSSOUTFILE功能導出CSV格式的數據文件到OSS引擎過程中占用集群最大的總內存為:
loose_max_oss_outfile_threads * loose_oss_outfile_buffer_size
盡量不要使OSSOUTFILE功能占用的總內存超過節點內存的5%,否則可能會影響當前節點上的其他業務。
使用說明
語法
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 | 表名稱。 |
示例
假設創建OSS server的語句為:
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"}');
將本地的數據文件導出至OSS,以上傳的OSS文件為
oss://polardb/B_outfile/tpch/1t/parallel-lineitem.TXT
,bucket名稱為polardb,路徑及文件名稱為B_outfile/tpch/1t/parallel-lineitem.TXT為例。示例如下:SELECT * FROM lineitem INTO OSSOUTFILE 'outserver/tpch/1t/parallel-lineitem.TXT' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
當集群版本為PolarDB MySQL版8.0.1.1.38及以上版本時,您可以通過以下命令查看當前導出任務實時占用的總內存數和總線程數。
查看導出任務實時占用的總內存數,單位為字節。
SHOW STATUS LIKE "%Oss_outfile_memory_used%";
查看導出任務實時占用的總線程數。
SHOW STATUS LIKE "%Oss_outfile_threads_running%";
說明當您連接集群地址執行導出任務時,必須保證
SHOW STATUS
命令和導出命令在同一個節點執行,才能查詢當前節點中導出命令占用的內存資源信息。
錯誤說明
若出現錯誤ERROR 1086 (HY000): File 'xxxx' already exists
,說明當前OSS上存在同名文件。
有如下兩種解決方法:
手動刪除OSS上對應的文件,再重新執行
select into ossoutfile
語句。使用
OSS_REPLACE_EXISTED_FILE()
的hint來強制覆蓋同名文件。格式如下:SELECT /*+ OSS_REPLACE_EXISTED_FILE() */ * FROM lineitem INTO OSSOUTFILE 'outserver/tpch/1t/parallel-lineitem.TXT' COLUMNS TERMINATED BY '|@|' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY "" LINES TERMINATED BY '\n';
說明使用該hint語法會強制覆蓋OSS上的同名文件,覆蓋后未開啟OSS多版本功能時文件無法找回,請慎重考慮。開啟OSS多版本功能請參見版本控制概述。
hint語法所需的PolarDB集群需為如下版本之一:
PolarDB MySQL版8.0.2版本且Revision version為8.0.2.2.9或以上。
PolarDB MySQL版8.0.1版本且Revision version為8.0.1.1.31或以上。