---
title: 编组
description: 使用 mysqldump 迁移 mysqldump 是 MySQL 最常用的逻辑导入导出的工具，主要用于转储数据库。 mysqldump mysqldump 备份原理是通过协议连接到数据库后，将需要备份的数据查询出来，并将查询的数据转换成对应的 INSERT 语句（逻辑导出）。 还原数据时，执行导出文件的 SQL 语…
---
切换语言

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

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

# 使用 mysqldump 迁移

更新时间：2026-06-23 08:42:33

mysqldump 是 MySQL 最常用的逻辑导入导出的工具，主要用于转储数据库。

## mysqldump

mysqldump 备份原理是通过协议连接到数据库后，将需要备份的数据查询出来，并将查询的数据转换成对应的 `INSERT` 语句（逻辑导出）。

还原数据时，执行导出文件的 SQL 语句即可 （逻辑导入）。通过此方法，可在不同租户之间，不同数据库之间进行数据迁移。

OceanBase 数据库兼容 MySQL 协议，您可以使用 mysqldump 对 OceanBase 数据库中的数据进行备份。

> **注意**
>
>  
>
> 使用 mysqldump 仅支持导出 OceanBase 数据库 MySQL 模式实例中的数据。

### 推荐版本

| 系统 | 版本 |
| --- | --- |
| Linux | mysqldump Ver 10.13 Distrib 5.6.37, for Linux (x86_64) |
| MacOS | mysqldump Ver 10.13 Distrib 5.7.21, for macos10.13 (x86_64) |

## 数据导出

### 数据导出语法

```sql
mysqldump -hxx.xx.xx.xx -P2881 -u'user@tenantname#clustername' -ppassword --skip-triggers --databases db1 db2 db3 --skip-extended-insert > /tmp/data.sql

```

> **说明**
>
>  
>
> 对于一些默认选项，在参数前使用--skip可以禁用或者取消相对应的效果。

| 参数 | 参数缩写 | 是否必填 | 描述 | 示例 |
| --- | --- | --- | --- | --- |
| --host | -h | 是 | 服务器IP地址 | -h192.168.*.* |
| --port | -P | 是 | 服务器端口号 | -P2881 |
| --user | -u | 是 | MySQL 模式租户的用户名：用户名@租户名#集群名。     > **说明**   >  如果只填写用户名，执行会默认 sys 租户。 | -uroot@MySQL#cluster1 |
| --password | -p | 否 | MySQL 密码 | -p1qaz@WSX |
| --databases | 无 | 是 | 指定数据库。 --all-databases：导出所有数据库，不推荐使用，建议单独指定。   > **说明**   > 实际使用中，可以直接填写数据库名。 | --databases db1 db2 db3 |
| --skip-triggers | 无 | 否 | 禁用触发器。   > **说明**   >  OceanBase 数据库目前不支持 trigger 语法，所以如果不指定 `--force` 参数时必须要加上该参数，否则无法导出。 | --skip-triggers |
| --skip-extended-insert | 无 | 否 | 导出语句为多条 `INSERT` 格式，否则为 `INSERT INTO table VALUES(...),(...),` 格式。 | --skip-extended-insert |
| > | 无 | 是 | 指定保存路径 | > /tmp/data.sql |

另外一些常用的参数：

| 参数 | 参数缩写 | 是否必填 | 描述 | 示例 |
| --- | --- | --- | --- | --- |
| -d | 无 | 否 | 仅导出表结构不导出数据。 | -d |
| -t | 无 | 否 | 只导出数据，而不添加CREATE TABLE 语句。 | -t |
| --compact | 无 | 否 | 压缩模式，产生更少的输出。 | --compact |
| --comments | 无 | 否 | 添加注释信息。 | --comments |
| --complete-insert | 无 | 否 | 输出完成的插入语句。 | --complete-insert |
| --force | 无 | 否 | 忽略错误。 | --force |
| --lock-tables | 无 | 否 | 在导出过程中锁库。 --skip-lock-tables：在导出过程中不锁库。   > ****说明**   >  当前版本 OceanBase 数据库中，无论使用哪个参数，在导出过程中都不会锁库。** | --lock-tables |

## 数据导入

登录数据库，执行以下命令进行导入：

```sql
source /tmp/data.sql

```

## 示例

### OceanBase 迁移示例

- 使用 mysqldump 迁移 MySQL 表到 OceanBase

  导出指定数据库的表结构（不包括数据）

  ```unknow
  mysqldump -h 127.1 -uroot -P2881 -p****** --skip-triggers -d TPCH --compact > tpch_ddl.sql

  ```

  在导出的脚本中：

     - 视图的定义也会在里面，但是会以注释（`/` *`!`* `/`）形式被标注。您无须关注视图部分，可将该部分内容删除。
     - 有一些语法 OceanBase MySQL 不支持，但不影响，替换掉其中部分即可。

  示例如下：

  ```unknow
  /*!40101 SET character_set_client = @saved_cs_client */;
  /*!40101 SET @saved_cs_client     = @@character_set_client */;
  /*!40101 SET character_set_client = utf8 */;
  CREATE TABLE `NATION` (
    `N_NATIONKEY` int(11) NOT NULL,
    `N_NAME` char(25) COLLATE utf8_unicode_ci NOT NULL,
    `N_REGIONKEY` int(11) NOT NULL,
    `N_COMMENT` varchar(152) COLLATE utf8_unicode_ci DEFAULT NULL,
    PRIMARY KEY (`N_NATIONKEY`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci MAX_ROWS=4294967295;

  ```

  在示例中，导出的脚本里有一个 `MAX_ROWS=` 的设置，这个是 MySQL 特有的，OceanBase MySQL 没有这个问题，也不需要这个设置，且不支持这个语法。您需要把所有 `MAX_ROWS=` 以及后面部分注释掉。注释方式可以使用批量替换技术，例如，在 Vim 中使用 `:%s/MAX_ROWS=/; -- MAX_ROWS=/g`。

  > **注意**
  >
  >  
  >
  > 上面导出的 SQL 中表名是大写，说明源端 MySQL 设置表名默认很可能是大小写敏感，因此目标 OceanBase MySQL 租户也要进行同样的设置。

  在导出的表结构语句里，可能包含外键。在导入 OceanBase MySQL 里时，如果外键依赖的表没有创建，导入脚本会报错，因此在导入之前需要禁用外键检查约束。

  ```unknow
  MySQL [oceanbase]> set global foreign_key_checks=off;
  Query OK, 0 rows affected (0.01 sec)

  MySQL [oceanbase]> show global variables like '%foreign%';
  +--------------------+-------+
  | Variable_name      | Value |
  +--------------------+-------+
  | foreign_key_checks | OFF   |
  +--------------------+-------+
  1 row in set (0.00 sec)

  ```

  在 obclient 里通过 `source` 命令可以执行外部 SQL 脚本文件。
 - 导出指定数据库的表数据（不包括结构）

  ```unknow
  mysqldump -h 127.1 -uroot -P2881 -p****** -t TPCH  > tpch_data.sql

  ```

  mysqldump 导出的数据初始化 SQL 里会首先将表锁住，禁止其他会话写。然后使用 `insert` 写入数据。每个 `insert` 后面的 `value` 里会有很多值。这是批量 `insert`。

  > **注意**
  >
  >  
  >
  > 当前版本 OceanBase 数据库支持 LOCK TABLES 语法输入，但是实际并未对数据库进行锁表，其他会话仍然可以进行写入。

  ```unknow
  LOCK TABLES `t1` WRITE;
  /*!40000 ALTER TABLE `t1` DISABLE KEYS */;
  INSERT INTO `t1` VALUES ('a'),('中');
  /*!40000 ALTER TABLE `t1` ENABLE KEYS */;
  UNLOCK TABLES;
  /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

  ```

### 常用示例

- 备份所有数据库：

  ```sql
  mysqldump -uroot -p --all-databases > /backup/mysqldump/alldb.sql

  ```
 - 备份指定数据库 test：

  ```sql
  mysqldump -uroot -p test > /backup/mysqldump/test.sql

  ```
 - 备份指定数据库指定表 table1，table2。(多个表以空格间隔)

  ```shell
  mysqldump -uroot -p  mysql table1 table2 > /backup/mysqldump/2table.sql

  ```
 - 备份指定数据库排除某些表

  ```sql
  mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.sql

  ```

## 常见问题

**数据处理超时**

当您需要导出的数据量较多时，可能会报 `TIMEOUT 4012` 错误。为避免这个错误您需要使用租户管理员账户登录数据库运行下述语句调整系统参数，导出完成后您可以修改回原值：

```sql
obclient> SET GLOBAL ob_trx_timeout=1000000000,GLOBAL ob_query_timeout=1000000000;

```

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