---
title: "LOAD DATA - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: LOAD DATA 描述 该语句用于从外部导入数据。 OceanBase 数据库 LOAD DATA 语句支持加载以下输入文件： 服务器端（OBServer 节点）文件 ：文件位于 OceanBase 数据库的 OBServer 节点上。可以使用 LOAD DATA INFILE 语句或 LOAD DATA FROM…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# LOAD DATA

更新时间：2026-06-18 10:13:19

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/5900.load-data-of-mysql-mode.md)  

## 描述

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

- **OceanBase 数据库 `LOAD DATA` 语句支持加载以下输入文件：**

     - **服务器端（OBServer 节点）文件**：文件位于 OceanBase 数据库的 OBServer 节点上。可以使用 `LOAD DATA INFILE` 语句或 `LOAD DATA FROM URL` 语句，将服务器端文件中加载数据到数据库表中。
     - **客户端（本地）文件**：文件位于客户端本地文件系统中。可以使用 `LOAD DATA LOCAL INFILE` 语句或 `LOAD DATA FROM URL` 语句，将客户端本地文件中的数据加载到数据库表中。

      #### 说明

      OceanBase 数据库在执行 `LOAD DATA LOCAL INFILE` 命令时，系统会自动添加 `IGNORE` 选项。
     - **OSS 文件**：文件位于 OSS 文件系统。可以使用 `LOAD DATA REMOTE_OSS INFILE` 语句，将 OSS 文件中的数据加载到数据库表中。
 - **LOAD DATA 目前可以对 CSV 格式的文本文件进行导入，整个导入的过程可以分为以下的流程：**

     1. **解析文件**：OceanBase 数据库会根据用户输入的文件名，读取文件中的数据，并且根据指定的并行度来决定并行或者串行解析输入文件中的数据。
     2. **分发数据**：由于 OceanBase 是分布式数据库，各个分区的数据可能分布在各个不同的 OBServer 节点，`LOAD DATA` 会对解析出来的数据进行计算，决定数据需要被发送到哪个 OBServer 节点。
     3. **插入数据**：当目标 OBServer 节点收到数据后，在本地执行 `INSERT` 操作将数据插入到对应的分区当中。

## 注意事项

- 带有触发器（Trigger）的表禁止使用 `LOAD DATA` 语句。
 - 要从外部文件导入数据，您需要具有 `FILE` 权限及以下设置：

     - 加载服务器端文件时，需要提前设置系统变量 [secure_file_priv](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685248)，配置导入或导出文件时可以访问的路径。
     - 加载客户端本地文件时，需要在启动 MySQL/[OBClient](https://www.oceanbase.com/softwarecenter-cloud) 客户端时添加 `--local-infile[=1]` 选项来启用从本地文件系统加载数据的功能。
 - 使用指定分区旁路导入时需要注意，目标表不能是复制表，且不能含有自增列、标识列、Global Index。

## 旁路导入相关限制（LOAD DATA 语法）

使用 `LOAD DATA` 配合 `APPEND`、`DIRECT(...)` 等 Hint 或租户级旁路配置执行导入时，除 [数据导入概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006277724) 中说明的**旁路导入能力**适用范围与限制外，还须满足以下 **`LOAD DATA` 语句级**限制：

- 不支持单行超过 2M 的数据导入。
 - `LOAD DATA` 语句支持在多行事务中运行，在执行时会主动提交之前的事务。
 - 对于带唯一索引的**全量**旁路导入，当出现重复唯一索引键时，暂时不支持 `REPLACE` 或 `IGNORE` 关键字，也不支持设置容错行。
 - 当 `DIRECT(...)` 的 `load_mode` 取值为 `inc_replace` 时，语句中不允许再写 `REPLACE` 或 `IGNORE` 关键字。

#### 说明

导入过程中若发生 **CSV 文件解析错误**，可能在 OBServer 安装路径下的 `log` 子目录生成 `obloaddata.log` 日志文件。**类型转换失败、主键冲突**等情况不会写入该日志文件。使用 `FROM FILES` 且指定 `LOG ERRORS` 子句时，失败行的诊断信息记录方式以该子句及 `SHOW WARNINGS` 为准，参见下文 [log_errors](#log_errors)。

## 语法

```sql
-- 导入普通文件
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}]]

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>'
    )

```

## 参数解释

| 参数 | 描述 |
| --- | --- |
| parallel(N) | 加载数据的并行度，默认为 4。 |
| load_batch_size(M) | 指定每次插入的批量大小，`M` 默认为 `100`。推荐取值范围为 [100,1000]。 |
| APPEND \| direct() \|NO_DIRECT | 使用 Hint 启用旁路导入功能。   #### 注意    在执行旁路导入任务的过程中，不建议同时进行 OceanBase 数据库的升级操作，因为这可能导致旁路导入任务失败。    - `APPEND` Hint 默认等同于使用的 `direct(true, 0)`，同时可以实现在线收集统计信息（`GATHER_OPTIMIZER_STATISTICS` Hint）的功能。 - `direct()` 参数解释如下：      - `bool`：表示写入的数据是否需要排序，`true` 表示需要排序，`false` 表示不需要排序。         #### 说明          在有序文件和备份数据（已按主键排序）导入的场景中，可设置 `need_sort` 的取值为 `false` 跳过排序流程；若数据未按主键排序且未显式开启排序（`need_sort` 的取值为 `true`）时，会触发错误。     - `int`：表示最大容忍的错误行数。     - `load_mode`：可选参数，表示旁路导入的模式。取值须使用英文单引号包起来，取值如下：            - `full`：默认值，表示全量导入。               #### 注意                对于带唯一索引的全量旁路导入，当出现重复唯一索引键时，暂时不支持 `REPLACE` 或 `IGNORE` 关键字，也不支持设置容错行。           - `inc`：用于增量旁路导入场景。主键冲突时按插入或忽略冲突的方式处理，具体行为与语句中的 `IGNORE` 等选项及 `inc` 模式下的执行语义有关。增量旁路导入的能力限制参见 [数据导入概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006277724)。           - `inc_replace`：表示增量导入，但不检查主键是否重复，相当于 `REPLACE` 语义的增量导入。               #### 注意                当 `load_mode` 取值为 `inc_replace` 时，`LOAD DATA` 语句中不允许有 `REPLACE` 或 `IGNORE` 关键字。 - `NO_DIRECT`：控制单条 SQL 强制不走旁路导入，只要输入的 SQL 带有该 Hint，则整个语句忽略其他旁路导入的 Hint，执行普通导入。   更多使用 `LOAD DATA` 旁路导入的信息，参见 [使用 LOAD DATA 语句旁路导入数据/文件](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006277725)。 |
| REMOTE_OSS \| LOCAL | 可选项，   - `REMOTE_OSS` 用于指定是否从对象存储上读取数据，如果使用了此参数，必须是一个对象存储的地址，支持阿里云的 OSS（`oss://`）、AWS 的 S3（`s3://`）及兼容 S3 的对象存储，如 OBS、GCS、COS 等（均使用 `s3://`）。 - `LOCAL` 用于指定是否从客户端的本地文件系统读取数据。如果不使用 `LOCAL` 参数，那么将从服务器端（OBServer 节点）的文件系统读取数据。  有关该参数的详细说明，参见 [使用 LOAD DATA 语句旁路导入数据/文件](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006277725)。 |
| file_name | 指定输入文件的路径和文件名。 `file_name` 有以下格式：   - 导入文件在 OBServer 节点或客户端：`/$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` 通过表的主键来判断数据是否重复，如果表不存在主键，则 `REPLACE` 与 `IGNORE` 选项没有区别。缺省情况下，既不按 `REPLACE` 覆盖冲突行，也不按 `IGNORE` 忽略冲突行；遇到唯一键冲突时，导入可能报错终止。   #### 注意    - 在 MySQL 模式中执行 `LOAD DATA LOCAL INFILE` 命令时，系统会自动添加 `IGNORE` 选项。这种行为提供了与 MySQL 数据库更好的兼容性。 - 使用 `REPLACE` 或者 `IGNORE` 子句的情况下，如果并行度大于 `1`，发生冲突的行最后插入的记录可能与串行执行的结果不同。如果需要严格保证冲突记录的插入结果，请不要指定该语句的并行度（或将并行度设置为 `1`）。 |
| url_table_function_expr | 可选项，通过 FILES 和 SOURCE 两个关键字从文件系统或数据源读取数据。   - FILES 用于描述需要导入的数据的地址，格式等信息。有关使用 FILES 的详细介绍，可参见下文 [FILES](#FILES)。 - SOURCE 用于定义通过 ODPS 格式的数据源进行数据提取。有关使用 SOURCE 的详细介绍，可参见下文 [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](#log_errors)。   #### 说明    对于 OceanBase 数据库 V4.3.5 版本，LOAD DATA 语句导入 URL 外表语法从 V4.3.5 BP2 版本开始支持指定错误诊断。 |

### FILES

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

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

     - 本地 LOCATION 格式为 `LOCATION = '[file://] local_file_path'`，其中 `local_file_path` 可以为相对路径，也可以为绝对路径。如果填写的是相对路径，则当前目录必须为 OceanBase 数据库的安装目录；`secure_file_priv` 用于配置 OBServer 节点有权限访问的文件路径。`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`，指定数据传输保护级别为 `authentication` 和 `privacy`。  

      #### 注意

      使用对象存储路径时，对象存储路径的各项参数由 `&` 符号进行分隔，请确保您输入的参数值中仅包含英文字母大小写、数字、`\/-_$+=` 以及通配符。如果您输入了上述以外的其他字符，可能会导致设置失败。
 - `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`：可选项，指定数据源的压缩格式，支持 `ZLIB`、`ZSTD`、`LZ4`、`ODPS_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).csv` 和 `test.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. 设置全局安全路径。

       ```shell
       obclient> SET GLOBAL secure_file_priv = "/"
       Query OK, 0 rows affected
       obclinet> \q
       Bye

       ```

       #### 说明

       由于 `secure_file_priv` 是 `GLOBAL` 变量，所以需要执行 `\q` 退出使之生效。
     2. 重连数据库后，从外部文件导入数据。

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

       ```

  **示例 2：使用 `APPEND` Hint 启用旁路导入功能。**

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

  ```

  **示例 3：导入 CSV 格式文件。**

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

      ```shell
      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` 文件的 `c1`、`c2` 列，并将它们导入到表 `t1` 的 `col1`、`col2` 列中。

      ```shell
      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 格式文件。**

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

  ```

  **示例 5：导入 ORC 格式文件。**

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

  ```

  **示例 5：导入 ODPS 格式文件。**

  ```shell
  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：从本地文件导入数据至 OceanBase 数据库表中。**

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

       ```shell
       obclient --local-infile -hxxx.xxx.xxx.xxx -P2881 -uroot@mysql001 -p****** -A -Dtest

       ```

       返回结果如下：

       ```shell
       Welcome to the OceanBase.  Commands end with ; or \g.
       Your OceanBase connection id is 3221719526
       Server version: OceanBase 4.2.2.0 (r100000022023121309-f536833402c6efe9364d5a4b61830a858ef24d82) (Built Dec 13 2023 09:58:18)

       Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.

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

       obclient [test]>

       ```

       #### 注意

       为了使用 `LOAD DATA LOCAL INFILE` 功能，请使用 V2.2.4 或之后的版本的 OBClient 客户端。如果您没有要求版本的 OBClient 客户端，也可以使用 MySQL 客户端来连接数据库。
     2. 在客户端中，执行 `LOAD DATA LOCAL INFILE` 语句来加载本地数据文件。

       ```shell
       obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/test_data/tbl1.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',';

       ```

       返回结果如下：

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

       ```

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

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

  ```

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

     - 指定一级分区旁路导入

  ```shell
  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';

  ```

     - 指定二级分区旁路导入

  ```shell
  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 上。**

  ```shell
  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 填写。

  以下将以外部文件的位置在本地和在 OceanBase 数据库 MySQL 模式中创建外表为例，步骤如下：

     1. 准备外部文件。

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

       ```shell
       [admin@xxx /home/admin/test_csv]# vi column_conv.csv

       ```

       文件的内容如下：

       ```shell
       1,short,short
       2,long_text,long_text
       3,long_text,long_text

       ```
     2. 设置导入的文件路径。

       #### 注意

       由于安全原因，设置系统变量 `secure_file_priv` 时，只能通过本地 Unix Socket 连接数据库执行修改该全局变量的 SQL 语句。更多信息，请参见 [secure_file_priv](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685248)。

            1. 执行以下命令，登录到 OBServer 节点所在的机器。

              ```shell
              ssh admin@10.10.10.1

              ```
            2. 执行以下命令，通过本地 Unix Socket 连接方式连接租户 `mysql001`。

              ```shell
              obclient -S /home/admin/oceanbase/run/sql.sock -uroot@mysql001 -p******

              ```
            3. 执行以下 SQL 命令，设置导入路径为 `/home/admin/test_csv`。

              ```sql
              SET GLOBAL secure_file_priv = "/home/admin/test_csv";

              ```
     3. 重新连接租户 `mysql001`。

       示例如下：

       ```shell
       obclient -h10.10.10.1 -P2881 -uroot@mysql001 -p****** -A -Ddb_test

       ```
     4. 创建表 `test_tbl1`。

       ```sql
       CREATE TABLE test_tbl1(col1 VARCHAR(5), col2 VARCHAR(5), col3 VARCHAR(5));

       ```
     5. 使用 `LOAD DATA` 语句导入 URL 外表语法向表 `test_tbl1` 导入数据，并指定错误诊断。

       ```sql
       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;

       ```

       返回结果如下：

       ```shell
       Query OK, 1 row affected, 2 warnings
       Records: 1  Deleted: 0  Skipped: 0  Warnings: 2

       ```
     6. 查看 Warnings。

       ```sql
       SHOW warnings;

       ```

       返回结果如下：

       ```shell
       +---------+------+----------------------------------------------------------------------------------------------------------------------+
       | 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

       ```
     7. 查看 `test_tbl1` 的数据。

       ```sql
       SELECT * FROM test_tbl1;

       ```

       返回结果如下：

       ```shell
       +------+-------+-------+
       | col1 | col2  | col3  |
       +------+-------+-------+
       | 1    | short | short |
       +------+-------+-------+
       1 row in set

       ```

  ## 相关文档

     - 更多有关连接 OceanBase 数据库的信息，请参见 [连接方式概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682520)。
     - 更多有关使用 `LOAD DATA` 语句的示例信息，请参见 [使用 LOAD DATA 语句导入数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682256)
     - 更多有关使用 `LOAD DATA` 旁路导入的示例信息，请参见 [使用 LOAD DATA 语句旁路导入数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006277725)

  上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
