跳到主要内容

LOAD DATA

描述

该语句用于从外部导入数据。

  • seekdb LOAD DATA 语句支持加载以下输入文件:

    • 服务器端(seekdb 节点)文件:文件位于 seekdb 的节点上。可以使用 LOAD DATA INFILE 语句或 LOAD DATA FROM URL 语句,将服务器端文件中加载数据到数据库表中。

    • 客户端(本地)文件:文件位于客户端本地文件系统中。可以使用 LOAD DATA LOCAL INFILE 语句或 LOAD DATA FROM URL 语句,将客户端本地文件中的数据加载到数据库表中。

      信息

      seekdb 在执行 LOAD DATA LOCAL INFILE 命令时,系统会自动添加 IGNORE 选项。

    • OSS 文件:文件位于 OSS 文件系统。可以使用 LOAD DATA REMOTE_OSS INFILE 语句,将 OSS 文件中的数据加载到数据库表中。

  • LOAD DATA 目前可以对 CSV 格式的文本文件进行导入,整个导入的过程可以分为以下的流程:

    1. 解析文件:seekdb 会根据用户输入的文件名,读取文件中的数据,并且根据指定的并行度来决定并行或者串行解析输入文件中的数据。

    2. 插入数据:当 seekdb 收到数据后,在本地执行 INSERT 操作将数据插入到对应的分区当中。

注意事项

  • 带有触发器(Trigger)的表禁止使用 LOAD DATA 语句。

  • 要从外部文件导入数据,您需要具有 FILE 权限及以下设置:

    • 加载服务器端文件时,需要提前设置系统变量 secure_file_priv,配置导入或导出文件时可以访问的路径。
    • 加载客户端本地文件时,需要在启动 MySQL 客户端时添加 --local-infile[=1] 选项来启用从本地文件系统加载数据的功能。
  • 使用指定分区旁路导入时需要注意,目标表不能是复制表,且不能含有自增列、标识列、Global Index。

语法

-- 导入普通文件
LOAD DATA
[/*+ PARALLEL(N) [load_batch_size(M)] [APPEND | direct(bool, int, [load_mode])] | NO_DIRECT */]
[REMOTE_OSS | LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE table_name [PARTITION(PARTITION_OPTION)]
[COMPRESSION [=] {AUTO|NONE|GZIP|DEFLATE|ZSTD}]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(column_name_var
[, column_name_var] ...)]

load_mode:
'full'
| 'inc_replace'

PARTITION_OPTION:
partition_option_list
| subpartition_option_list

-- 导入 URL 文件
LOAD DATA
[/*+ PARALLEL(N) [load_batch_size(M)] [APPEND | direct(bool, int, [load_mode])] | NO_DIRECT */]
[REPLACE | IGNORE]
FROM { url_table_function_expr |
( SELECT expression_list FROM url_table_function_expr ) }
INTO TABLE table_name
[PARTITION(PARTITION_OPTION)]
[(column_name_var [, column_name_var] ...)]
[LOG ERRORS [REJECT LIMIT {integer | UNLIMITED}]]

load_mode:
'full'
| 'inc_replace'

url_table_function_expr:

FILES (
LOCATION = '<string>',
{
FORMAT = (
TYPE = 'CSV',
LINE_DELIMITER = '<string>' | <expr>,
FIELD_DELIMITER = '<string>' | <expr>,
PARSE_HEADER = { TRUE | FALSE },
ESCAPE = '<character>' | <expr>,
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>,
ENCODING = 'charset',
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...),
SKIP_HEADER = <int>,
SKIP_BLANK_LINES = { TRUE | FALSE },
TRIM_SPACE = { TRUE | FALSE },
EMPTY_FIELD_AS_NULL = { TRUE | FALSE }
)
| FORMAT = ( TYPE = 'PARQUET' | 'ORC' )
},
[PATTERN = '<regex_pattern>']
)
| SOURCE (
TYPE = 'ODPS',
ACCESSID = '<string>',
ACCESSKEY = '<string>',
ENDPOINT = '<string>',
TUNNEL_ENDPOINT = '<string>',
PROJECT_NAME = '<string>',
SCHEMA_NAME = '<string>',
TABLE_NAME = '<string>',
QUOTA_NAME = '<string>',
COMPRESSION_CODE = '<string>'
)

PARTITION_OPTION:
partition_option_list
| subpartition_option_list

参数解释

参数描述
parallel(N)加载数据的并行度,默认为 4。
load_batch_size(M)指定每次插入的批量大小,M 默认为 100。推荐取值范围为 [100,1000]。
APPEND | direct() |NO_DIRECT使用 Hint 启用旁路导入功能。
注意在执行旁路导入任务的过程中,不建议同时进行 seekdb 的升级操作,因为这可能导致旁路导入任务失败。
  • APPEND Hint 默认等同于使用的 direct(true, 0),同时可以实现在线收集统计信息(GATHER_OPTIMIZER_STATISTICS Hint)的功能。
  • direct() 参数解释如下:
    • bool:表示写入的数据是否需要排序,true 表示需要排序,false 表示不需要排序。
      说明 在有序文件和备份数据(已按主键排序)导入的场景中,可设置 need_sort 的取值为 false 跳过排序流程;若数据未按主键排序且未显式开启排序(need_sort 的取值为 true)时,会触发错误。
    • int:表示最大容忍的错误行数。
    • load_mode:可选参数,表示旁路导入的模式。取值须使用英文单引号包起来,取值如下:
      • full:默认值,表示全量导入。
        注意 对于带唯一索引的全量旁路导入,当出现重复唯一索引键时,暂时不支持 REPLACEIGNORE 关键字,也不支持设置容错行。
      • inc:表示增量导入,支持 INSERTIGNORE 语义。
      • inc_replace:表示增量导入,但不检查主键是否重复,相当于 REPLACE 语义的增量导入。
        注意load_mode 取值为 inc_replace 时,LOAD DATA 语句中不允许有 REPLACEIGNORE 关键字。
  • NO_DIRECT:控制单条 SQL 强制不走旁路导入,只要输入的 SQL 带有该 Hint,则整个语句忽略其他旁路导入的 Hint,执行普通导入。
更多使用 LOAD DATA 旁路导入的信息,参见 使用 LOAD DATA 语句旁路导入数据/文件
REMOTE_OSS | LOCAL可选项,
  • REMOTE_OSS 用于指定是否从对象存储上读取数据,如果使用了此参数,必须是一个对象存储的地址,支持阿里云的 OSS(oss://)、AWS 的 S3(s3://)及兼容 S3 的对象存储,如 OBS、GCS、COS 等(均使用 s3://)。
  • LOCAL 用于指定是否从客户端的本地文件系统读取数据。如果不使用 LOCAL 参数,那么将从服务器端(seekdb 节点)的文件系统读取数据。
有关该参数的详细说明,参见 使用 LOAD DATA 语句旁路导入数据/文件
file_name指定输入文件的路径和文件名。 file_name 有以下格式:
  • 导入文件在 seekdb 节点或客户端:/$PATH/$FILENAME
  • 导入文件在 OSS 上:oss://$PATH/$FILENAME/?host=$HOST&access_id=$ACCESS_ID&access_key=$ACCESSKEY
参数解释如下:
  • $PATH:指定了存储桶中的文件路径,表示文件所在的目录。
  • $FILENAME:指定了文件的名称,表示要访问的具体文件。
  • $HOST:指定了 OSS 服务的主机名或 CDN 加速的域名,即要访问的 OSS 服务的地址。
  • $ACCESS_ID:指定了访问 OSS 服务所需的 Access Key ID,用于身份验证。
  • $ACCESSKEY:指定了访问 OSS 服务所需的 Access Key Secret,用于身份验证。

说明 在导入 OSS 上的文件时,需要确保以下信息:
  • 确保访问 OSS 存储桶和文件的权限。你需要拥有足够的权限来读取指定的存储桶和文件。这通常需要在 OSS 控制台或通过 OSS API 设置访问权限,并将访问密钥(Access Key ID 和 Access Key Secret)配置为具有适当权限的凭据。
  • 确保数据库服务器可以通过网络连接到指定的 $HOST 地址,以访问 OSS 服务。如果使用的是 OSS 服务的 CDN 加速域名,还需要确保 CDN 配置正确,并且网络连接正常。
REPLACE | IGNORE如果遇到唯一键冲突,REPLACE 表示覆盖冲突行,IGNORE 表示忽略冲突行。LOAD DATA 通过表的主键来判断数据是否重复,如果表不存在主键,则 REPLACEIGNORE 选项没有区别。缺省时,遇到重复数据的时候,LOAD DATA 会将出现错误的数据记录到日志文件中。
注意
  • 执行 LOAD DATA LOCAL INFILE 命令时,系统会自动添加 IGNORE 选项。这种行为提供了与 MySQL 数据库更好的兼容性。
  • 使用 REPLACE 或者 IGNORE 子句的情况下,如果并行度大于 1,发生冲突的行最后插入的记录可能与串行执行的结果不同。如果需要严格保证冲突记录的插入结果,请不要指定该语句的并行度(或将并行度设置为 1)。
url_table_function_expr可选项,通过 FILES 和 SOURCE 两个关键字从文件系统或数据源读取数据。
  • FILES 用于描述需要导入的数据的地址,格式等信息。有关使用 FILES 的详细介绍,可参见下文 FILES
  • SOURCE 用于定义通过 ODPS 格式的数据源进行数据提取。有关使用 SOURCE 的详细介绍,可参见下文 SOURCE
table_name导入数据的表的名称。
  • 支持分区表与非分区表。
  • 支持指定表任意列数目。
PARTITION_OPTION指定分区旁路导入时的分区名:
  • partition_option_list:一级分区列表,同时插入多个分区时以逗号(,)分隔。
  • subpartition_option_list:二级分区列表,同时插入多个分区时以逗号(,)分隔。

说明 指定分区只支持旁路导入,不支持普通的 LOAD DATA,即如果没添加旁路导入的 Hint 或者没有设置旁路导入的配置项,执行 LOAD DATA 时指定分区是不生效的。
COMPRESSION指定压缩文件格式,其中
  • AUTO:根据文件名后缀自动探测压缩算法。
    在使用 AUTO 参数时,不同的后缀名有对应的压缩格式。
    • .gz:对应 GZIP 压缩文件。
    • .deflate:对应 DEFLATE 压缩文件。
    • .zst/.zstd:对应 ZSTD 压缩文件。
  • NONE:表示文件没有压缩。
  • GZIP:GZIP 压缩文件。
  • DEFLATE:不带元数据的GZIP压缩文件。
  • ZSTD:ZSTD 压缩文件。
可以明确文件的压缩格式或者让程序根据文件名后缀来探测压缩格式。
FIELDS | COLUMNS指定字段的格式。
  • ENCLOSED BY:设置导出值的修饰符。
  • TERMINATED BY:设置导出列的结束符。
  • ESCAPED BY:设置导出值忽略的字符。
LINES STARTING BY指定行起始符。
LINES TERMINATED BY指定行结束符。
IGNORE number { LINES | ROWS }忽略前几行,LINES 表示文件的前几行,ROWS 表示由字段分隔符指定的前几行数据。缺省时,会将输入文件中的字段逐个与表中的列进行对应。如果输入文件中并没有包含所有的列,那么缺少的列按照以下的规则会被默认填充:
  • 字符类型:空字符串。
  • 数值类型:0。
  • 日期类型:0000-00-00

说明多文件导入时,与单文件导入行为同理。
column_name_var可选项,指定导入的列名。
LOG ERRORS [REJECT LIMIT {integer | UNLIMITED}]可选项,用于开启导入 URL 外表过程中的错误诊断。详细介绍,可参见下文 log_errors
说明 seekdb 中 LOAD DATA 语句导入 URL 外表语法,支持指定错误诊断。

FILES

FILES 关键字由 LOCATION 子句、 FORMAT 子句和 PATTERN 子句构成。

  • LOCATION 子句用于指定外表文件存放的路径。通常外表的数据文件存放于单独一个目录中,文件夹中可以包含子目录,在创建表时,外表会自动收集该目录中的所有文件。

    • 本地 LOCATION 格式为 LOCATION = '[file://] local_file_path',其中 local_file_path 可以为相对路径,也可以为绝对路径。如果填写的是相对路径,则当前目录必须为 seekdb 的安装目录;secure_file_priv 用于配置 seekdb 节点有权限访问的文件路径。local_file_path 只能是 secure_file_priv 路径的子路径。

    • 远程 Location 格式如下:

      • LOCATION = '{oss|cos|S3}://$ACCESS_ID:$ACCESS_KEY@$HOST:s3_region/remote_file_path' ,其中 $ACCESS_ID$ACCESS_KEY$HOST 为访问 OSS、COS 和 S3 所需配置的访问信息,s3_region 为使用 S3 时选择的区域信息,这些敏感的访问信息会以加密的方式存放在数据库的系统表中
      • LOCATION = 'hdfs://$ {hdfs_namenode_address}:${port}/PATH.localhost'port 指的是 HDFS 的端口号,PATH 指 HDFS 中的目录路径。
        • 带 kerberos 认证:LOCATION = 'hdfs://localhost:port/user?principal=xxx&keytab=xxx&krb5conf=xxx&configs=xxx'。 其中:
          • principal: 指登录认证用户。
          • keytab:指定用户认证的密钥文件路径。
          • krb5conf:指定用户使用 kerberos 环境的描述文件路径。
          • configs: 指定额外的 HDFS 配置项,默认为空,但是如果是 kerberos 环境,则通常该配置项有值,需要进行配置,例如:dfs.data.transfer.protection=authentication,privacy,指定数据传输保护级别为 authenticationprivacy
      提示

      使用对象存储路径时,对象存储路径的各项参数由 & 符号进行分隔,请确保您输入的参数值中仅包含英文字母大小写、数字、\/-_$+= 以及通配符。如果您输入了上述以外的其他字符,可能会导致设置失败。

  • FORMAT 子句用于指定读取文件格式相关的属性,支持 CSV/PARQUET/ORC 三种文件格式。

    • TYPE = 'CSV' 时,包含以下字段:

      • LINE_DELIMITER:指定 CSV 文件的行分隔符,默认为 LINE_DELIMITER='\n'
      • FIELD_DELIMITER:可选项,指定 CSV 文件的列分隔符,默认为 FIELD_DELIMITER='\t'
      • PARSE_HEADER:可选项,指定 CSV 文件的第一行是否为每列的列名。默认为 FALSE,表示不指定 CSV 文件的第一行为每列的列名。
      • ESCAPE:指定 CSV 文件的转义符号,只能为 1 个字节,默认为 ESCAPE ='\'
      • FIELD_OPTIONALLY_ENCLOSED_BY:可选项,指定 CSV 文件中包裹字段值的符号,默认为空。使用此选项表示只对部分类型的字段(如 CHAR, VARCHAR, TEXT, JSON 等)加包裹符。
      • ENCODING:指定文件的字符集编码格式,如果不指定,默认值为 UTF8MB4
      • NULL_IF:指定被当作 NULL 处理的字符串。默认值为空。
      • SKIP_HEADER:跳过文件头,并指定跳过的行数。
      • SKIP_BLANK_LINES:指定是否跳过空白行。默认值为 FALSE,表示不跳过空白的行。
      • TRIM_SPACE:指定是否删除文件中字段的头部和尾部空格。默认值为 FALSE,表示不删除文件中字段头尾的空格。
      • EMPTY_FIELD_AS_NULL:指定是否将空字符串当作 NULL 处理。默认值为 FALSE,表示不将空字符串当做 NULL 处理。
    • TYPE = 'PARQUET/ORC' 时,无其他额外字段。

  • PATTERN 子句指定一个正则模式串,用于过滤 LOCATION 目录下的文件。对于每个 LOCATION 目录下的文件路径,如果能够匹配该模式串,外表会访问这个文件,否则外表会跳过这个文件。如果不指定该参数,则默认可以访问 LOCATION 目录下的所有文件。

SOURCE

SOURCE 关键字不包含其他子句,此时 TYPE = 'ODPS' 且有以下字段:

  • ACCESSID:指定 ODPS 用户的 ID。
  • ACCESSKEY:指定 ODPS 用户的密码。
  • ENDPOINT:指定 ODPS 服务的连接地址。
  • TUNNEL_ENDPOINT:指定 Tunnel 数据传输服务的连接地址。
  • PROJECT_NAME:指定需要查询的表所在的 Project。
  • SCHEMA_NAME:可选项,指定需要查询表的 SCHEMA。
  • TABLE_NAME:指定需要查询的表名。
  • QUOTA_NAME:可选项,选择是否使用指定的 Quota。
  • COMPRESSION_CODE:可选项,指定数据源的压缩格式,支持 ZLIBZSTDLZ4ODPS_LZ4 四种压缩格式,不设置表示不开启压缩。

log_errors

  • LOG ERRORS:表示开启导入过程中的错误诊断,允许将失败的行记录下来(当前版本记录于 warning buffer 中,可以通过 show warnings 查看,最大不超过 64 行),而不是让整个操作因第一个错误而终止。配合 REJECT LIMIT 子句,可以控制允许的错误行数。

  • REJECT LIMIT: 可选项,用于设置允许的最大错误行数:

    • 默认值为 0:表示不允许任何错误行,遇到第一个错误时操作失败。
    • integer:单机允许的最大错误行数。例如,10 表示一台机器上遇到的错误最多为 10 行。
    • UNLIMITED: 允许无限数量的错误行。
提示
  • 不指定 LOG ERRORS 子句行为为正常导入行为,即遇到第一个错误就直接报错。
  • 指定了 LOG ERRORS 子句但是没有指定 REJECT LIMIT 子句, 相当于指定了 LIMIT 为 0 的诊断,会在遇到第一个错误时操作失败,但是会记录遇到的第一个错误,并且错误码也是诊断相关错误,即 “reject limit reached”。

多文件旁路导入时通配符的规则

为便于多文件导入,引入文件通配符功能,适用于服务器端和 OSS 文件导入,不适用于客户端文件导入。

  • 服务器端通配符使用

    • 匹配规则:

      • 匹配文件名:load data /*+ parallel(20) direct(true, 0) */ infile '/xxx/test.*.csv' replace into table t1 fields terminated by '|';

      • 匹配目录:load data /*+ parallel(20) direct(true, 0) */ infile '/aaa*bb/test.1.csv' replace into table t1 fields terminated by '|';

      • 同时匹配目录和文件名:load data /*+ parallel(20) direct(true, 0) */ infile '/aaa*bb/test.*.csv' replace into table t1 fields terminated by '|';

    • 注意事项:

      • 必须存在至少一个匹配的文件,否则返回错误码 4027。

      • load data /*+ parallel(20) direct(true, 0) */ infile '/xxx/test.1*.csv,/xxx/test.6*.csv' replace into table t1 fields terminated by '|'; 的输入,/xxx/test.1*.csv,/xxx/test.6*.csv 会被认为是整体匹配,若无匹配则报错 4027。

      • 只支持 POSIX 的 GLOB 函数能支持的通配符,例如 test.6*(6|0).csvtest.6*({0.csv,6.csv}|.csv) 尽管可通过 ls 命令查找,但 GLOB 函数无法匹配,会报错 4027。

  • 云对象存储服务(OSS)中通配符使用

    • 匹配规则:

      匹配文件名:load data /*+ parallel(20) direct(true, 0) */ remote_oss infile 'oss://xxx/test.*.csv?host=xxx&access_id=xxx&access_key=xxx' replace into table t1 fields terminated by '|';

    • 注意事项:

      • 不支持目录匹配。例如:load data /*+ parallel(20) direct(true, 0) */ remote_oss infile 'oss://aa*bb/test.*.csv?host=xxx&access_id=xxx&access_key=xxx' replace into table t1 fields terminated by '|'; 会返回 OB_NOT_SUPPORTED

      • 文件名通配符只支持 *?。其他通配符虽然允许输入,但无法匹配任何结果。

示例

信息

LOAD DATA 加载数据时支持使用 \N 代表 NULL

从服务器端文件导入数据

示例 1:服务器端文件导入数据。

  1. 设置全局安全路径。

    SET GLOBAL secure_file_priv = "/"
    Query OK, 0 rows affected
    obclinet> \q
    Bye
    信息

    GLOBAL 变量,所以需要执行 \q 退出使之生效。

  2. 重连数据库后,从外部文件导入数据。

    LOAD DATA INFILE 'test.sql' INTO TABLE t1;
    Query OK, 0 rows affected

示例 2:使用 APPEND Hint 启用旁路导入功能。

LOAD DATA /*+ PARALLEL(4) APPEND */
INFILE '/home/admin/a.csv'
INTO TABLE t;

示例 3:导入 CSV 格式文件。

  • 导入 test1.csv 文件的全部列。

    load data  /*+ direct(true,0) parallel(2)*/
    from files(
    location = "data/csv",
    format = (
    type = 'csv',
    field_delimiter = ',',
    parse_header = true,
    skip_blank_lines = true
    ),
    pattern = 'test1.csv')
    into table t1;
  • 读取 data/csv 路径下的 test1.csv 文件的 c1c2 列,并将它们导入到表 t1col1col2 列中。

    load data  /*+ direct(true,0) parallel(2)*/
    from (
    select c1, c2 from files(
    location = 'data/csv'
    format = (
    type = 'csv',
    field_delimiter = ',',
    parse_header = true,
    skip_blank_lines = true
    ),
    pattern = 'test1.csv'))
    into table t1 (col1, col2);

示例 4:导入 PARQUET 格式文件。

load data  /*+ direct(true,0) parallel(2)*/
from files(
location = "data/parquet",
format = ( type = 'PARQUET'),
pattern = 'test1.parquet')
into table t1;

示例 5:导入 ORC 格式文件。

load data  /*+ direct(true,0) parallel(2)*/
from files(
location = "data/orc",
format = ( type = 'ORC'),
pattern = 'test1.orc')
into table t1;

示例 5:导入 ODPS 格式文件。

load data  /*+ direct(true,0) parallel(2)*/
from source (
type = 'ODPS',
accessid = '$ODPS_ACCESSID',
accesskey = '******',
endpoint= '$ODPS_ENDPOINT',
project_name = 'example_project',
schema_name = '',
table_name = 'example_table',
quota_name = '',
compression_code = '')
into table t1;

从客户端(本地)文件导入数据

示例 1:从本地文件导入数据至 seekdb 表中。

  1. 打开终端或命令提示符窗口,并输入以下命令来启动客户端。

    mysql -h127.0.0.1 -uroot -P2881 -p****** -A -Dtest

    返回结果如下:

    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3221504802
    Server version: 5.7.25 OceanBase 4.3.5.3 SeekDB (r1.0.0.0) (Built 100000262025111218-5343637512e28c346f938516af53b7879d4d5974 Nov 12 2025)

    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MySQL [(none)]>
  2. 在客户端中,执行 LOAD DATA LOCAL INFILE 语句来加载本地数据文件。

    LOAD DATA LOCAL INFILE '/home/admin/test_data/tbl1.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',';

    返回结果如下:

    Query OK, 3 rows affected
    Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

示例 2:通过设置 COMPRESSION 直接导入压缩文件。

LOAD DATA LOCAL INFILE '/your/file/lineitem.tbl.gz'
INTO TABLE lineitem
COMPRESSION GZIP
FIELDS TERMINATED BY '|';

示例 3:通过 PARTITION 指定分区旁路导入。

  • 指定一级分区旁路导入
load data /*+ direct(true,0) parallel(2) load_batch_size(100) */
infile "$FILE_PATH"
into table t1 partition(p0, p1)
fields terminated by '|' enclosed by '' lines starting by '' terminated by '\n';
  • 指定二级分区旁路导入
load data /*+ direct(true,0) parallel(2) load_batch_size(100) */
infile "$FILE_PATH"
into table t1 partition(p0sp0, p1sp1)
fields terminated by '|' enclosed by '' lines starting by '' terminated by '\n';

从 OSS 文件导入数据

示例 1:使用 direct(bool, int) Hint 启用旁路导入功能,旁路导入文件可在 OSS 上。

load data /*+ parallel(1) direct(false,0)*/ remote_oss infile 'oss://antsys-oceanbasebackup/backup_rd/xiaotao.ht/lineitem2.tbl?host=***.oss-cdn.***&access_id=***&access_key=***' into table lineitem fields terminated by '|' enclosed by '' lines starting by '' terminated by '\n';

从服务器端文件以 URL 外表方式导入数据

提示

示例中涉及 IP 的命令做了脱敏处理,在验证时应根据自己机器真实 IP 填写。

以下将以外部文件的位置在本地和在 seekdb中创建外表为例,步骤如下:

  1. 准备外部文件。

    执行以下命令,在要登录 seekdb 节点所在机器的 /home/admin/test_csv 目录下,创建文件 column_conv.csv

    vi column_conv.csv

    文件的内容如下:

    1,short,short
    2,long_text,long_text
    3,long_text,long_text
  2. 设置导入的文件路径。

    提示

    由于安全原因,设置系统变量 secure_file_priv 时,只能通过本地 Unix Socket 连接数据库执行修改该全局变量的 SQL 语句。更多信息,参见 secure_file_priv

    1. 执行以下命令,登录到 seekdb 所在的机器。

      ssh admin@10.10.10.1
    2. 执行以下命令,通过本地 Unix Socket 连接方式连接租户 mysql001

      mysql -S /home/admin/oceanbase/run/sql.sock -uroot -p******
    3. 执行以下 SQL 命令,设置导入路径为 /home/admin/test_csv

      SET GLOBAL secure_file_priv = "/home/admin/test_csv";
  3. 重新连接 seekdb。

    示例如下:

    mysql -h127.0.0.1 -uroot -P2881 -p****** -A -Ddb_test
  4. 创建表 test_tbl1

    CREATE TABLE test_tbl1(col1 VARCHAR(5), col2 VARCHAR(5), col3 VARCHAR(5));
  5. 使用 LOAD DATA 语句导入 URL 外表语法向表 test_tbl1 导入数据,并指定错误诊断。

    LOAD DATA FROM FILES(
    LOCATION = '/home/admin/test_csv',
    FORMAT = (
    TYPE = 'csv',
    FIELD_DELIMITER = ','),
    PATTERN = 'column_conv.csv')
    INTO TABLE test_tbl1
    LOG ERRORS REJECT LIMIT UNLIMITED;

    返回结果如下:

    Query OK, 1 row affected, 2 warnings
    Records: 1 Deleted: 0 Skipped: 0 Warnings: 2
  6. 查看 Warnings。

    SHOW warnings;

    返回结果如下:

    +---------+------+----------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message |
    +---------+------+----------------------------------------------------------------------------------------------------------------------+
    | Warning | 1406 | fail to scan file column_conv.csv at line 2 for column "db_test"."test_tbl1"."col2", error: Data too long for column |
    | Warning | 1406 | fail to scan file column_conv.csv at line 3 for column "db_test"."test_tbl1"."col2", error: Data too long for column |
    +---------+------+----------------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.001 sec)
  7. 查看 test_tbl1 的数据。

    SELECT * FROM test_tbl1;

    返回结果如下:

    +------+-------+-------+
    | col1 | col2 | col3 |
    +------+-------+-------+
    | 1 | short | short |
    +------+-------+-------+
    1 row in set (0.001 sec)

相关文档