您可以通过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-internal.aliyuncs.com", "oss_bucket": "polardb", "oss_access_key_id": "*******", "oss_access_key_secret": "********", "oss_prefix":"B_outfile"}');
说明需要设置oss_endpoint为内网地址,规则格式为oss-{xxx}-internal.aliyuncs.com。
将本地的数据文件导出至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或以上。