将本地表串行导出至OSS引擎

您可以通过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后进行导出。详情请参见连接数据库集群

  • 如果您需要增量备份数据至OSS,您可以创建备份计划,并配置备份计划来将数据增量备份至OSS。

  • 建议您在只读节点执行导出任务。您可以在SQL语句中添加HINT语法/*FORCE_SLAVE*/或直接连接只读节点进行导出。

参数说明

参数

说明

loose_oss_outfile_buffer_size

每个oss outfile线程可以占用的内存大小。取值范围:102400~536870912。默认值为134217728。单位:Byte。一般占用内存越大,导出速度越快。

loose_max_oss_outfile_threads

PolarDB可以同时启动的oss outfile线程数量。取值范围:1~100。默认值为1。单位:个。

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

说明

集群版本为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的文件位置,包含如下几部分内容:

  • OSS server信息,用来标识当前使用的OSS节点和上传的基本路径。详情请参见通过OSS外表访问OSS数据

  • (可选)当前任务单独的路径

  • 上传后的文件名。

上述三者之间用/连接。当前任务单独的路径中可以包含多个/,表示使用多级路径。上传到OSS引擎后,其整体的文件路径为:OSS server中的路径+单独的路径。outfile_path中必须包含上传后的文件名,用来说明最后生成的文件名。

table_name

表名称。

示例

  1. 假设创建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。

  2. 将本地的数据文件导出至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或以上。