您可以通过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或以上。
注意事项
暂不支持通过DMS连接PolarDB将数据文件导出至OSS引擎,相应的报错为:
Can not issue executeUpdate() or executeLargeUpdate() for SELECTs
您可以通过客户端或者命令行连接到PolarDB后进行导出。详情请参见连接数据库集群。参数说明
参数 | 说明 |
---|---|
loose_oss_outfile_buffer_size | 每个oss outfile线程可以占用的内存大小。取值范围:102400~536870912。默认值为134217728。单位:Byte。一般占用内存越大,导出速度越快。 |
loose_max_oss_outfile_threads | PolarDB可以同时启动的oss outfile线程数量。取值范围:1~100。默认值为1。单位:个。 您可以使用 |
说明 使用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
标识符。
- NULL_MARKER:直接定义NULL的输出值,
- LINES TERMINATED BY:每一行之间的分隔符。
详情请参见MySQL官方文档。
参数 | 说明 |
---|---|
outfile_path | 主要标识输出到OSS的文件位置,包含如下几部分内容:
/ 连接。当前任务单独的路径中可以包含多个/ ,表示使用多级路径。上传到OSS引擎后,其整体的文件路径为:OSS server中的路径+单独的路径。outfile_path 中必须包含上传后的文件名,用来说明最后生成的文件名。 |
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的文件为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';
oss://polardb/B_outfile/tpch/1t/parallel-lineitem.TXT
。polardb为bucket名称,B_outfile/tpch/1t/parallel-lineitem.TXT为路径及文件名称。
若出现错误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或以上。