---
title: "使用 OBDUMPER 导出数据 | OceanBase 文档中心"
description: 使用 OBDUMPER 导出数据 OBDUMPER 是一款使用 Java 开发的客户端导出工具。可以使用该工具将 OceanBase 数据库中定义的对象结构和数据导出到文件中。 说明 请在 OceanBase 官方网站左上角，单击 资源 &gt; 下载中心 获取 OceanBase 导数工具（包括导入工具 OBLOADER…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

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

# 使用 OBDUMPER 导出数据

更新时间：2026-06-26 08:33:39

OBDUMPER 是一款使用 Java 开发的客户端导出工具。可以使用该工具将 OceanBase 数据库中定义的对象结构和数据导出到文件中。

#### 说明

请在 OceanBase 官方网站左上角，单击 **资源** > [下载中心](https://www.oceanbase.com/softwarecenter-enterprise) 获取 OceanBase 导数工具（包括导入工具 OBLOADER 和导出工具 OBDUMPER）的安装包。如果未找到对应版本的安装包，请联系技术支持获取。

## OBDUMPER 简介

与 MyDumper 和 SQLDeveloper 等导出工具相比，OBDUMPER 具备以下显著优势：

- 高性能：在无主键表和分区表等场景下，已提供针对性的性能优化。
 - 多功能：提供数据预处理、多种类型的数据格式和全局一致性非锁定导出数据等功能。

## 产品功能

OBDUMPER 提供将 OceanBase 数据库中的对象结构和表中的数据导出到文件中，主要具备以下功能特性：

- 支持导出数据库对象定义的语句。
 - 支持将表中的数据按照 CSV 或者 SQL 格式导出到文件中。
 - 支持指定分区名，导出指定分区内的表数据。
 - 支持指定全局的过滤条件，仅导出满足条件的数据。
 - 支持配置数据预处理规则，导出前对数据进行转换处理。
 - 支持基于 SCN/TIMESTAMP 闪回查询，导出任意事务点或者时间点的数据。
 - 支持将导出数据上传到 OSS 云存储服务。
 - 支持从 OceanBase 的备副本中导出数据。（区别于备集群）
 - 支持按照 SQL, CSV, CUT 三种数据格式导出自定义查询的结果集。
 - 支持非锁表的情况下，通过读取快照版本来保证导出数据的全局一致性。

## 支持的 OceanBase 数据库

已支持的 OceanBase 数据库模式与版本，如下表所示：

| OceanBase 模式 | **支持的版本** 号 |
| --- | --- |
| Oracle 模式 | 2.2.30、2.2.52、2.2.7x、3.1.x、3.2.x |
| MySQL 模式 | 1.4.70、1.4.72、1.4.75、1.4.78、1.4.79、2.2.30、2.2.50、2.2.70、2.2.71、2.2.72、2.2.76、3.1.x、3.2.x |

## 注意事项

- 标准的 CSV 格式请参考 [RFC 4180](http://mirrors.nju.edu.cn/rfc/inline-errata/rfc4180.html) 规范，建议导出严格遵从 [RFC 4180](http://mirrors.nju.edu.cn/rfc/inline-errata/rfc4180.html) 规范。
 - 导出大量数据时，请在运行的脚本中修改虚拟机的内存参数。
 - 命令行参数指定的对象名、数据文件名、规则文件名要求大小写一致。Oracle 默认大写，MySQL 默认小写。
 - 导出数据前建议用户触发一次合并，可以提升导出的性能。
 - 导出的数据文件的命名规范是 table.group.sequence.suffix。
 - 外键中包含多列，导出时无法保证列的顺序。例如：FOREIGN KEY(c1,c2) REFERENCE (c1,c2)。
 - OceanBase MySQL 1.4.72 不支持导出唯一前缀索引的定义。例如：UNIQUE(c1(10)) 。
 - OceanBase MySQL 1.4.x 不支持导出生成列的定义。例如：GENERATED ALWAYS AS (expr)。
 - OceanBase MySQL 2.2.7x 不支持导出垂直分区。例如：partition by column。
 - OceanBase MySQL 2.2.7x 不支持导出 SYNONYM 对象定义。
 - OceanBase MySQL 2.2.7x 不支持导出索引的存储列。例如：storing(column_list)。
 - OceanBase Oracle 2.2.50 之前版本中不支持导出函数索引的定义。
 - OceanBase Oracle 2.2.50 之前版本不支持导出 TYPE 对象的定义。
 - OceanBase Oracle 模式下不支持导出 interval day(2) to second(0) 类型的数据。
 - Windows 系统不能使用 ！作为分隔符。数据库的对象名不能包含 \ / : * ? " < > | 等特殊符号，否则数据库对象定义和表数据都无法正常导出。

## 限制模式

> **说明**
>
>  
>
> 限制模式仅适用于用户无法直接提供 `--sys-user` 和 `--sys-password` 选项的场景。

- 使用限制模式（`--public-cloud`）从公共云部署的 OceanBase 集群导出数据时无需指定 `-t`, `-c`

  连接选项，从私有云部署的 OceanBase 集群导出数据时需要指定 `-t` 连接选项，连接 ODP 服务时还需要加上 `-c` 选项。如果用户未使用限制模式，OBDUMPER 必须指定 `--sys-user` 和 `--sys-password` 选项。
 - 使用限制模式（`--public-cloud`）导出对象定义时，仅可以导出 TABLE 和 VIEW 两种对象类型的定义。其中 TABLE 类型的定义中不包含索引、注释等信息。并且导出数据的性能低于非限制模式下导出数据的性能。

## 闪回导出

使用 FLASHBACK 导出数据时，需要设置合理的 `undo_retention` 系统变量。

假设 t1 为撤回（Undo）操作的时间点，且 t2 = t1 + 900s，则在 t2 时间点可以查询到 [t1,t2] 区间内的数据。设置 `undo_retention` 后，当前的会话仅对 t1 之后的时间点的数据有效，对 t1 时间点之前的数据无效。该参数默认单位：秒，默认值：1800。设置 `undo_retention` 变量语句如下：

```sql
SET global undo_retention=900;

```

- 目前只能在 sys 租户下查询 `v$ob_timestamp_service` 视图获取有效的 OceanBase SCN。
 - 可通过固定时间点查询最近一次版本合并的数据。例如：t1 时间点发起合并，最早可查询到 t1 时间点的数据。
 - 如果所查询的表已被删除且放置在回收站，则需要先将该表从回收站中恢复。
 - 闪回查询受限于转储，如果发生转储且 `undo_retention` 变量未设置，则无法查询。
 - 设置 `undo_retention` 变量后，可查询 t1（转储时间点）+ `undo_retention` 变量设置的时间范围内的数据。

## 语法格式

和导出 MySQL 数据库一样，导出 OceanBase 数据库时也建议您将表结构和数据分开导出。命令语法如下：

> **注意**
>
>  
>
> - 您需要指定业务租户的用户名和密码。
>  - 如果要导出表结构，还需要指定 sys 租户的用户 `root` 的密码或用户 `proxyro` 和其密码。为安全起见，OBPROXY 默认禁止使用用户 `proxyro` 登录 OceanBase 集群，但是因为 `root` 用户的权限过于大，所以还是推荐您使用用户 `proxyro` 获取表的元数据信息。

```shell
./obdumper -h <主机IP> -P <端⼝> -u <⽤⼾> -p <密码> --sys-user <sys 租户下的root 用户或 proxyro 用户> --sys-password <sys 租⼾下的账⼾密码> -c <集群> -t <租⼾> -D <Schema 库名> [--ddl] [--csv|--sql] [--all|--table '表名'] -f<数据⽂件或者⽬录>只导出表结构

```

| 参数 | 是否必选 | 说明 | 示例 |
| --- | --- | --- | --- |
| -h(--host) | 是 | 连接 OBProxy 或者直连 OBServer 的主机地址。 | -h 127.0.0.1 |
| -P(--port) | 是 | 连接 OBProxy 或者直连 OBServer 的主机端口。      **说明**     - 直连访问数据库默认使用 2881 端口，可以自定义。 - 通过 OBProxy 代理连接一般使用 2883 端口，可以自定义。 | -P 2881 |
| -c(--cluster) | 否 | 数据库的集群名。直连 OBServer 时无需指定。 | -c 'cluste1' |
| -t(--tenant) | 否 | 当前用户的租户名。 | -t sys |
| -u(--user) | 是 | 数据库用户名。 | -u root |
| -p(--password) | 否 | 数据库密码。 | -p '**1***' |
| -D(--database) | 是 | 数据库名。 | -D 'database1' |
| -f(--file-path) | 是 | 指定数据导出的目录。 | -f '/path/file' |
| --sys-user | 否 | 指定 sys 租户下某用户的用户名，默认值 root@sys。 | --sys-user 'root@sys' |
| --sys-password | 否 | 指定 sys 租户下某用户的密码，默认值为空。 | --sys-password '**1***' |
| --csv | 否 | 导出 CSV 文件，默认的文件后缀是 .csv（推荐）。 | --csv |
| --sql | 否 | 导出 SQL 文件，默认的文件后缀是 .sql。 | --sql |
| --ddl | 否 | 导出 DDL 文件，默认的文件后缀是 -schema.sql。 | --ddl |
| --all | 否 | 导出所有的数据库对象。默认为表、视图、触发器、函数、存储过程、序列和同义词等。 | --all |
| --table | 否 | 指定待导出的表，多个表用逗号分隔。值为 '*' 时则导出 -D 库中所有的表。 | --table 'table1' |
| --where | 否 | 支持指定全局条件导出符合条件的数据。 | --where 'id > 0' |

有关 OBDUMPER 参数说明详情，请参见 [OBDUMPER 命令行选项](https://www.oceanbase.com/docs/enterprise-oceanbase-dumper-loader-cn-10000000000351816)。

## 只导出表结构

下文演示了导出业务租户 `obmysql` 下的数据库 `test` 下的表结构。

```shell
[root@****]# bin/obdumper -h 10.0.0.0 -P 2883 -u u_dumper -p ****** --sys-user=proxyro --sys-password=****** -c obce-3zones -t obmysql -D test --ddl --all -f /tmp/obdumper
1970-01-01 21:14:55 [INFO] Parsed args:
-h[--host] 10.0.0.0
-P[--port] 2883
-u[--user] u_dumper
-p[--password] ******
[--sys-user] proxyro
[--sys-password] ******
-c[--cluster] obce-3zones
-t[--tenant] obmysql
-D[--database] test
[--ddl]
[--all]
-f[--file-path] /tmp/obdumper

1970-01-01 11:34:20 [INFO] The security certificate file: "/mysql/ob-loader-dumper-3.0.0-SNAPSHOT/conf/secure.crt" is not exists
1970-01-01 11:34:20 [INFO] Load jdbc driver class: "com.oceanbase.jdbc.Driver" finished
1970-01-01 11:34:20 [INFO] The manifest file: "/tmp/obdumper/data/MANIFEST.bin" has been saved
1970-01-01 11:34:21 [INFO] Query the column metadata for the table: "test0" finished
1970-01-01 11:34:21 [INFO] Query the column metadata for the table: "test1" finished
1970-01-01 11:34:21 [INFO] Found 1 empty tables before dump out records. Elapsed: 152.3 ms
1970-01-01 11:34:21 [WARN] No views are exist in the schema: "test"
1970-01-01 11:34:21 [INFO] Generate 1 dump tasks finished. Total Elapsed: 5.762 ms
1970-01-01 11:34:21 [INFO] Start 1 schema dump threads finished
1970-01-01 11:34:21 [INFO] Build direct com.alibaba.druid.pool.DruidDataSource finished
1970-01-01 11:34:21 [INFO] Build proxyro com.alibaba.druid.pool.DruidDataSource finished
1970-01-01 11:34:21 [INFO] Return the latest compatible version: 3.1.2 -> 2.2.71
1970-01-01 11:34:21 [INFO] DbType: OBMYSQL Version: 3.1.2
1970-01-01 11:34:21 [INFO] ObMySql(3.1.2) is older than 2.2.71 ? false
1970-01-01 11:34:21 [INFO] Load meta/obmysql/obmysql14x.xml, meta/obmysql/obmysql22x.xml, meta/obmysql/obmysql2271.xml successed
1970-01-01 11:34:21 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireDependencies()
1970-01-01 11:34:21 [INFO] Query 0 dependencies elapsed 376.0 ms
1970-01-01 11:34:23 [INFO] Query table: "test1" attr finished. Remain: 1
1970-01-01 11:34:23 [INFO] Query table: "test0" attr finished. Remain: 0
1970-01-01 11:34:23 [INFO] Query 2 tables elapsed 2.059 s
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireTablespaceMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireSequenceMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireSynonymMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireTypeMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireTypeBodyMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquirePackageMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquirePackageBodyMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireTriggerMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireProcedureMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireFunctionMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireDatabaseLinkMapping()
1970-01-01 11:34:23 [WARN] c.o.t.l.s.o.ObMySqlDatabase does't implement acquireDependencies()
1970-01-01 11:34:23 [INFO] Dump [TABLE] test1 to "/tmp/obdumper/data/test/TABLE/test1-schema.sql" finished
1970-01-01 11:34:23 [INFO] Dump [TABLE] test0 to "/tmp/obdumper/data/test/TABLE/test0-schema.sql" finished
1970-01-01 11:34:23 [INFO] No.1 It has dumped 2 tables finished. Remain: 0
1970-01-01 11:34:23 [INFO] Total dumped 2 tables finished
1970-01-01 11:34:23 [INFO] Dump the ddl of schema: "test" finished
1970-01-01 11:34:24 [INFO] Close connection count: 14 of the DataSource. Key: 11_124_5_29_44564_857230679_test
1970-01-01 11:34:24 [INFO] Close connection count: 11 of the DataSource. Key: 11_124_5_29_44564_167438737_oceanbase
1970-01-01 11:34:24 [INFO] Shutdown task context finished
1970-01-01 11:34:24 [INFO]
Finished Tasks: 1 Running Tasks: 0 Progress: 100.00%
1970-01-01 11:34:24 [INFO]

All Dump Tasks Finished:

----------------------------------------------------------------------------------------------------------------------------
        No.#        |        Type        |             Name             |            Count             |       Status
----------------------------------------------------------------------------------------------------------------------------
         1          |       TABLE        |            test0             |              1               |      SUCCESS
         2          |       TABLE        |            test1             |              1               |      SUCCESS
----------------------------------------------------------------------------------------------------------------------------

Total Count: 2  End Time: 1970-01-01 11:34:24

1970-01-01 11:34:24 [INFO] Dump schema finished. Total Elapsed: 3.117 s
1970-01-01 11:34:24 [INFO] System exit 0

```

OBDUMPER 导出的目录结构如下，您可通过目录结构快速找到导出脚本或者日志。

```shell
[root@****]# tree /tmp/obdumper/
/tmp/obdumper/
├── data
│   ├── CHECKPOINT.bin
│   ├── MANIFEST.bin
│   └── test
│       └── TABLE
│           └── t1-schema.sql
└── logs
    ├── ob-loader-dumper.error
    ├── ob-loader-dumper.info
    └── ob-loader-dumper.warn

4 directories, 6 files

```

## 只导出数据

```shell
[root@****]# bin/obdumper -h 10.0.0.0 -P 2883 -u u_dumper -p ****** --sys-user=proxyro --sys-password=****** -c obce-3zones -t obmysql -D test --csv --all -f /tmp/obdumper
1970-01-01 11:02:53 [INFO] Parsed args:
[--host] 10.0.0.0
[--port] 2883
[--user] u_dumper
[--tenant] obmysql
[--cluster] obce-3zones
[--password] ******
[--database] test
[--sys-user] proxyro
[--sys-password] ********
[--csv] true
[--file-path] u_dumper
[--all] true

1970-01-01 11:02:53 [INFO] The security certificate file: "/ob-loader-dumper-3.0.0-SNAPSHOT/conf/secure.crt" is not exists
1970-01-01 11:02:53 [INFO] Load jdbc driver class: "com.oceanbase.jdbc.Driver" finished
1970-01-01 11:02:53 [INFO] The manifest file: "/tmp/obdumper/data/MANIFEST.bin" has been saved
1970-01-01 11:02:54 [INFO] Query the column metadata for the table: "test0" finished
1970-01-01 11:02:54 [INFO] Query the table entry for table: "test0" finished. Remain: 0
1970-01-01 11:03:22 [INFO] Generate 1 csv dump task for non-partitioned table(without primary key): test0. Remain: 0
1970-01-01 11:03:22 [INFO] Generate 1 dump tasks finished. Total Elapsed: 28.03 s
1970-01-01 11:03:22 [INFO] Start 192 record dump threads for 1 dump tasks finished
1970-01-01 11:03:23 [INFO] Dump 10 rows test.test0 to "u_dumper/data/test/TABLE/test0.csv" finished
1970-01-01 11:03:24 [INFO] Close connection count: 3 of the DataSource. Key: 11_124_5_29_44564_857230679_test
1970-01-01 11:03:24 [INFO] Close connection count: 1 of the DataSource. Key: 11_124_5_29_44564_167438737_oceanbase
1970-01-01 11:03:24 [INFO] Shutdown task context finished
1970-01-01 11:03:24 [INFO]
Finished Tasks: 1 Running Tasks: 0 Progress: 100.00%
1970-01-01 11:03:24 [INFO]

----------------------------------------------------------------------------------------------------------------------------
        No.#        |        Type        |             Name             |            Count             |       Status
----------------------------------------------------------------------------------------------------------------------------
         1          |       TABLE        |            test0             |              10              |      SUCCESS
----------------------------------------------------------------------------------------------------------------------------

Total Count: 10  End Time: 1970-01-01 11:03:24

1970-01-01 11:03:24 [INFO] Unnecessary to merge the data files. As --file-name is missing
1970-01-01 11:03:24 [INFO] Dump record finished. Total Elapsed: 29.67 s
1970-01-01 11:03:24 [INFO] Unnecessary to upload the data files to the remote cloud storage service
1970-01-01 11:03:24 [INFO] System exit 0

```

目录结构如下：

```shell
[root@****]# tree /tmp/obdumper
/tmp/obdumper
├── data
│   ├── CHECKPOINT.bin
│   ├── MANIFEST.bin
│   └── test
│       └── TABLE
│           ├── t1.0.csv
│           └── t1-schema.sql
└── logs
    ├── ob-loader-dumper.error
    ├── ob-loader-dumper.info
    └── ob-loader-dumper.warn

4 directories, 7 files

```

导出的数据文件（CSV 格式）和表结构文件在同一个目录。

## 查看导出结果文件

```shell
[root@****]# cat /tmp/obdumper/data/test/TABLE/t1-schema.sql
create table if not exists `t1` (
        `id` bigint(20) not null auto_increment,
        `c1` timestamp not null default CURRENT_TIMESTAMP,
        primary key (`id`)
)
default charset=utf8mb4
default collate=utf8mb4_general_ci;[root@obce-0000 ob-loader-dumper-2.1.13-SNAPSHOT]#
[root@****OBC]# cat /tmp/obdumper/data/test/TABLE/t1.0.csv
'id','c1'
1,'1970-01-01 21:16:03'
2,'1970-01-01 21:16:05'
3,'1970-01-01 21:16:05'
4,'1970-01-01 21:16:06'
5,'1970-01-01 21:16:06'
6,'1970-01-01 21:16:18'
7,'1970-01-01 21:16:18'
8,'1970-01-01 21:16:19'

```

## 用户提示

### 一致性非锁定导出

obdumper 与 mysqldump 的区别之一是没有采用锁表的方式实现，锁表可能对业务造成较大的影响。obdumper 提供两种方式可以导出全局一致性的快照数据。

- 基于 OceanBase 冻结的版本号，关于冻结版本的概念可以阅读 OceanBase 存储方面的资料。
 - 基于数据库的闪回功能，可以指定 SCN 或者 Timestamp 开启闪回。OceanBase Oracle 模式中的闪回功能和 Oracle 中的闪回功能是类似的。

一致性导出常见的几点问题：

- 什么场景下需要一致性非锁定导出？

  业务不可以停写，也不可以影响业务的正常读写操作。用户需要考虑一致性非锁定的方式导出数据。
 - 一致性非锁定导出需要注意什么事项？

  一致性非锁定导出依赖 undo 日志的保留时间，数据库发生 undo 回收会导致无法查询到历史快照数据。导出前用户需要手动设置合理的 undo retention 参数。undo 保留越长对磁盘的占用会增加。
 - 一致性非锁定导出会带来什么问题？

  一致性非锁定导出是无法导出最新写入的业务数据。OceanBase 是准内存数据库，新的业务数据优先会写入内存，并没有持久化到磁盘。

### 非一致性导出

obdumper 默认采用的是非一致性导出。它的优势是不锁表，内存中的增量数据也可以被导出。它的缺点是无法保证全局的数据一致性。如果业务接受停写，可以采用默认的方式导出。

## 更多信息

关于 OBDUMPER 的更多使用信息，请参见 [数据处理](https://www.oceanbase.com/docs/enterprise-oceanbase-dumper-loader-cn-10000000000351824)。

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