您可以通过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_threadsPolarDB可以同时启动的oss outfile线程数量。取值范围:1~100。默认值为1。单位:个。

您可以使用show status like "Oss_outfile_threads_running";命令查看当前集群正在运行的OSS outfile线程数量。

说明 使用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的文件位置,包含如下几部分内容:
  • OSS server信息,用来标识当前使用的OSS节点和上传的基本路径。详情请参见通过OSS外表访问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,示例如下:
    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的文件为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或以上。