---
title: "使用 OUTFILE 语句导出数据 - OceanBase 数据库 V4.3.2 | OceanBase 文档中心"
description: 使用 OUTFILE 语句导出数据 SELECT INTO OUTFILE 语句常用的一种数据导出方式。 SELECT INTO OUTFILE 语句能够对需要导出的字段做出限制，这很好的满足了某些不需要导出主键字段的场景。配合 LOAD DATA INFILE 语句导入数据，是一种很便利的数据导入导出方式。 背景信…
---
切换语言

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

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

# 使用 OUTFILE 语句导出数据

更新时间：2025-03-20 19:22:24

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.2/zh-CN/500.data-migration/1000.use-sql-statements-migrate-data/300.use-outfile-statements-to-migrate-data.md)  

`SELECT INTO OUTFILE` 语句常用的一种数据导出方式。 `SELECT INTO OUTFILE` 语句能够对需要导出的字段做出限制，这很好的满足了某些不需要导出主键字段的场景。配合 `LOAD DATA INFILE` 语句导入数据，是一种很便利的数据导入导出方式。

## 背景信息

OceanBase 数据库兼容这一个语法。

| 模式 | 建议使用的 OceanBase 数据库版本 | 建议使用的客户端 |
| --- | --- | --- |
| MySQL 模式 | V2.2.40 及以上 | MySQL Client、OBClient |
| Oracle 模式 | V2.2.40 及以上 | OBClient |

#### 注意

客户端需要直连 OceanBase 数据库实例以做导入导出操作。

## 权限要求

- 在 MySQL 租户下执行 `SELECT INTO` 语句，需要拥有 `FILE` 权限和对应表的 `SELECT` 权限。如果需要为用户授予 `FILE` 权限，可以使用以下命令格式：

  ```sql
   GRANT FILE ON *.* TO user_name;

  ```

  其中，`user_name` 是需要执行 `SELECT INTO` 命令的用户。有关 OceanBase 数据库权限的详细介绍，请参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052880)。
 - 在 Oracle 租户下执行 `SELECT INTO` 语句，需要拥有对应表的 `SELECT` 权限。有关 OceanBase 数据库权限的详细介绍，参见 [Oracle 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052867)。

## 语法

```sql
SELECT [/*+parallel(N)*/] column_list_option
INTO {OUTFILE 'file_name' [PARTITION BY part_expr] [{CHARSET | CHARACTER SET} charset_name] [field_opt] [line_opt] [file_opt]
     | DUMPFILE 'file_name'
     | into_var_list}
FROM table_name_list
[WHERE where_conditions]
[GROUP BY group_by_list [HAVING having_search_conditions]]
[ORDER BY order_expression_list];

column_list_option:
    column_name [, column_name ...]

field_opt:
    {COLUMNS | FIELDS} field_term_list

field_term_list:
  field_term [, field_term ...]

field_term:
    {[OPTIONALLY] ENCLOSED | TERMINATED | ESCAPED} BY string

line_opt:
    LINES line_term_list

line_term_list:
    line_term [, line_term ...]

line_term:
    {STARTING | TERMINATED} BY string

file_opt:
    file_option [, file_option ...]

file_option:
    SINGLE [=] {TRUE | FALSE}
    | MAX_FILE_SIZE [=] {int | string}
    | BUFFER_SIZE [=] {int | string}

```

## 参数解释

| 参数 | 描述 |
| --- | --- |
| parallel(N) | 可选项，指定执行语句的并行度。 |
| column_list_option | 表示导出的列选项。如果要选中全部数据可以用 `*` 表示。   `column_name`：列名称。更多查询语句列选项的信息，参见 [SIMPLE SELECT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001054666)。 |
| file_name | 用于指定导出文件的路径和文件名。`file_name` 有以下格式：   - 将导出文件保存在 OBServer 节点：`/$PATH/$FILENAME`。 - 将导出文件保存在 OSS 上：`oss://$PATH/$FILENAME/?host=$HOST&access_id=$ACCESS_ID&access_key=$ACCESSKEY`。   参数解释如下：   - `$PATH`：指定要保存导出文件的路径。      - 导出到 OBServer 节点中就是指定导出文件在 OBServer 节点的路径。     - 导出到 OSS 上就是指定存储桶中的文件路径。 - `$FILENAME`：指定要导出文件的名称。当 `SINGLE = FALSE` 时表示导出文件的前缀，不指定时会生成默认的前缀 `data`，系统自动生成后缀。 - `$HOST`：指定 OSS 服务的主机名或 CDN 加速的域名，即要访问的 OSS 服务的地址。 - `$ACCESS_ID`：指定访问 OSS 服务所需的 Access Key ID，用于身份验证。 - `$ACCESSKEY`：指定了访问 OSS 服务所需的 Access Key Secret，用于身份验证。    #### 说明    由于阿里云 OSS 有文件大小的限制，对于超过 5 GB 的文件，导出到 OSS 时会被拆分成多个文件，每个文件小于 5 GB。 |
| PARTITION BY part_expr | #### 说明    对于 OceanBase 数据库 V4.3.2 版本，从 V4.3.2 BP1 版本开始支持控制导出数据的分区方式。   可选项，用于控制导出数据的分区方式，`part_expr` 的值作为导出路径的一部分，对每行数据计算 `part_expr` 的值，`part_expr` 取值相同的行属于同一个分区，将导出到同一个目录中。   #### 注意    - 当数据按分区导出数据时，要求 `SINGLE = FALSE`，即允许导出多文件。 - 当前按分区导出数据仅支持导入到 OSS 上。 |
| CHARSET \| CHARACTER SET charset_name | 可选项，指定导出到外部文件的字符集。`charset_name` 表示字符集的名称。 |
| field_opt | 可选项，导出字段格式选项。指定输出文件中各个字段的格式，通过 `FIELDS` 或 `COLUMNS` 子句来指定。详细介绍可参见下文 [field_term](#field_term)。 |
| line_opt | 可选项，导出数据行的开始和结束符选项。指定输出文件中每一行的开始和结束字符，通过 `LINES` 子句设置。详细介绍可参见下文 [line_term](#line_term)。 |
| file_opt | 可选项，控制是否导出到多个文件和导出到多文件时单个文件的大小。详细介绍可参见下文 [file_option](#file_option)。 |
| FROM table_name_list | 指定选择数据的对象。 |
| WHERE where_conditions | 可选项，指定筛选条件，查询结果中仅包含满足条件的数据。更多查询语句的筛选信息，参见 [SIMPLE SELECT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001054666)。 |
| GROUP BY group_by_list | 可选项，指定分组的字段，通常与聚合函数配合使用。   #### 说明    `SELECT` 子句后面的所有列中，没有使用聚合函数的列，必须出现在 `GROUP BY` 子句后面。 |
| HAVING having_search_conditions | 可选项，筛选分组后的各组数据。`HAVING` 子句与 `WHERE` 子句类似，但是 `HAVING` 子句可以使用累计函数（如 `SUM`、`AVG` 等）。 |
| ORDER BY order_expression_list | 可选项，指定结果集按照一个列或者多个列用来 `ASC` 或 `DESC` 显示查询结果。不指定 `ASC` 或者 `DESC` 时，默认为 `ASC`。   - `ASC`：表示升序。 - `DESC`：表示降序。 |

### field_term

- `[OPTIONALLY] ENCLOSED BY string`：用来指定包裹字段值的符号，默认没有引用符号。例如，`ENCLOSED BY '"'` 表示字符值放在双引号之间。如果使用了 `OPTIONALLY` 关键字，则仅对字符串类型的值使用指定字符包裹。
 - `TERMINATED BY string`：用来指定字段值之间的符号。例如，`TERMINATED BY ','` 指定了逗号作为两个字段值之间的标志。
 - `ESCAPED BY string`：用来指定转义字符，以便处理特殊字符或解析特殊格式的数据。默认的转义字符是反斜杠（`\`）。

### line_term

- `TERMINATED BY string`：指定每一行的结束字符，默认使用换行符。例如，`... LINES TERMINATED BY '\n' ...` 表示一行将以换行符作为结束标志。

### file_option

- `SINGLE [=] {TRUE | FALSE}`：用于控制将数据导出到单个文件或多个文件。

     - `SINGLE [=] TRUE`：默认值，表示只能导出到单个文件。
     - `SINGLE [=] FALSE`：表示可以导出到多个文件。

      #### 注意

      当并行度大于 1 且 `SINGLE = FALSE` 时，可以导出到多个文件，达到并行读并行写和提高导出速度的效果。
 - `MAX_FILE_SIZE [=] {int | string}`：用于控制导出时单个文件的大小，仅在 `SINGLE = FALSE` 时生效。
 - `BUFFER_SIZE [=] {int | string}`：用于控制导出时每个线程为每个分区专门申请的内存大小（不分区可视为单个分区），默认取值为 1 MB。

  #### 说明

     - `BUFFER_SIZE` 用于导出性能调优，当机器内存充足且希望提高导出效率时，可设置一个较大的值（例如 4 MB），当机器内存不足时，可设置一个较小的值（例如 4 KB。设置为 0 时，表示单个线程中所有分区都使用一块公共内存）。
     - 对于 OceanBase 数据库 V4.3.2 版本，从 V4.3.2 BP1 版本开始支持 `BUFFER_SIZE` 参数。

## 示例

### 导出数据文件到本地

1. 设置导出的文件路径。

   要导出文件，需要先设置系统变量 `secure_file_priv`，配置导出文件可以访问的路径。

   #### 注意

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

      1. 登录到要连接 OceanBase 数据库的 OBServer 节点。

        ```bash
        ssh admin@xxx.xxx.xxx.xxx

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

        ```bash
        obclient -S /home/admin/oceanbase/run/sql.sock -usys@oracle001 -p******

        ```
      3. 设置导出路径为 `/home/admin/test_data`。

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

        ```
      4. 退出登录。
 2. 重新连接数据库后，使用 `SELECT INTO OUTFILE` 语句导出数据。指定逗号作为两个字段值之间的标志；对字符串类型的值使用 `"` 字符包裹；使用换行符作为结束标志。

      - 串行写单个文件，指定文件名为 `test_tbl1.csv`。

       ```sql
       SELECT /*+parallel(2)*/ *
       INTO OUTFILE '/home/admin/test_data/test_tbl1.csv'
         FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
         LINES TERMINATED BY '\n'
       FROM test_tbl1;

       ```

       返回结果如下：

       ```shell
       Query OK, 9 rows affected

       ```
      - 并行写多个文件，不指定文件名，并且每个文件的大小不超过 4MB。

       ```sql
       SELECT /*+parallel(2)*/ *
         INTO OUTFILE '/home/admin/test_data/'
         FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
         LINES TERMINATED BY '\n'
         SINGLE = FALSE MAX_FILE_SIZE = '4MB'
       FROM test_tbl1;

       ```

       返回结果如下：

       ```
      - 并行写多个文件，指定文件名的前缀为 `dd2024`，并且每个文件的大小不超过 4MB。

       ```sql
       SELECT /*+parallel(2)*/ *
         INTO OUTFILE '/home/admin/test_data/dd2024'
         FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
         LINES TERMINATED BY '\n'
         SINGLE = FALSE MAX_FILE_SIZE = '4MB'
       FROM test_tbl1;

       ```

       返回结果如下：

       ```  

   #### 说明

      - 当多个导出任务同时导出到相同路径时，可能出现报错、只导出一部分数据等问题。可以通过合理设置导出路径规避，  
       例如：  
       `SELECT /*+parallel(2)*/ * INTO OUTFILE 'test/data' SINGLE = FALSE FROM t1;` 和 `SELECT /*+parallel(2)*/ * INTO OUTFILE 'test/data' SINGLE = FALSE FROM t2;` 同时执行时可能由于导出文件名相同而报错，建议将导出路径设置为 `test/data1` 和 `test/data2`。
      - 当 `SINGLE = FALSE`，且导出因为 file already exist 等原因失败后，可以清除导出目录下所有与导出目标具有相同前缀的文件，或者删除导出目录再重建，然后再次执行导出操作。  
       例如：  
       `SELECT /*+parallel(2)*/ * INTO OUTFILE 'test/data' SINGLE = FALSE FROM t1;` 失败后，可以删除 `test` 目录下所有 `data` 前缀的文件，或者直接删除 `test` 目录再重建，然后再次尝试执行导出操作。
 3. 登录机器，在 OBServer 节点的 `/home/admin/test_data` 目录下查看导出的文件信息。

   ```shell
   [xxx@xxx /home/admin/test_data]# ls

   ```

   返回结果如下：

   ```shell
   data_0_0_0  data_0_1_0  dd2024_0_0_0  dd2024_0_1_0  test_tbl1.csv

   ```

   其中，`test_tbl1.csv` 是串行写单个文件示例导出的文件名；`data_0_0_0` 和 `data_0_1_0` 是并行写多个文件，不指定文件名示例导出的文件名；`dd2024_0_0_0` 和 `dd2024_0_1_0` 是并行写多个文件，指定文件名的前缀为 `dd2024` 示例导出的文件名。

### 导出数据文件到 OSS

使用 `SELECT INTO OUTFILE` 语句从 `test_tbl2` 表中按分区导出数据到指定的 OSS 存储位置。分区依据是 `col1` 和 `col2` 列的组合，相同的行属于同一个分区，将导出到同一个目录中。

```sql
SELECT /*+parallel(3)*/ *
  INTO OUTFILE 'oss://$DATA_FOLDER_NAME/?host=$OSS_HOST&access_id=$OSS_ACCESS_ID&access_key=$OSS_ACCESS_KEY'
    PARTITION BY CONCAT(col1,'/',col2)
    SINGLE = FALSE BUFFER_SIZE = '2MB'
FROM test_tbl2;

```

存储位置由 `$DATA_FOLDER_NAME` 变量指定，同时需要提供 OSS 的主机地址、访问 ID 和访问密钥。

## 更多信息

通过 `SELECT INTO OUTFILE` 方法导出的文件，可以通过 `LOAD DATA` 语句进行导入，详细方法，请参考 [使用 LOAD DATA 导入数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001049863)。

 上一篇 下一篇 ![有帮助](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) 咨询热线
