首批通过分布式安全可靠测评,为关键业务系统打造
使用 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) |
数据导出
数据导出语法
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 模式租户的用户名:用户名@租户名#集群名。说明 |
-uroot@MySQL#cluster1 |
| --password | -p | 否 | MySQL 密码 | -p1qaz@WSX |
| --databases | 无 | 是 | 指定数据库。 --all-databases:导出所有数据库,不推荐使用,建议单独指定。
说明 |
--databases db1 db2 db3 |
| --skip-triggers | 无 | 否 | 禁用触发器。
说明 |
--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:在导出过程中不锁库。
说明 |
--lock-tables |
数据导入
登录数据库,执行以下命令进行导入:
source /tmp/data.sql
示例
OceanBase 迁移示例
使用 mysqldump 迁移 MySQL 表到 OceanBase
导出指定数据库的表结构(不包括数据)
mysqldump -h 127.1 -uroot -P2881 -p****** --skip-triggers -d TPCH --compact > tpch_ddl.sql在导出的脚本中:
视图的定义也会在里面,但是会以注释(
/!/)形式被标注。您无须关注视图部分,可将该部分内容删除。有一些语法 OceanBase MySQL 不支持,但不影响,替换掉其中部分即可。
示例如下:
/*!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 里时,如果外键依赖的表没有创建,导入脚本会报错,因此在导入之前需要禁用外键检查约束。
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 脚本文件。导出指定数据库的表数据(不包括结构)
mysqldump -h 127.1 -uroot -P2881 -p****** -t TPCH > tpch_data.sqlmysqldump 导出的数据初始化 SQL 里会首先将表锁住,禁止其他会话写。然后使用
insert写入数据。每个insert后面的value里会有很多值。这是批量insert。注意
当前版本 OceanBase 数据库支持 LOCK TABLES 语法输入,但是实际并未对数据库进行锁表,其他会话仍然可以进行写入。
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 */;
常用示例
备份所有数据库:
mysqldump -uroot -p --all-databases > /backup/mysqldump/alldb.sql备份指定数据库 test:
mysqldump -uroot -p test > /backup/mysqldump/test.sql备份指定数据库指定表 table1,table2。(多个表以空格间隔)
mysqldump -uroot -p mysql table1 table2 > /backup/mysqldump/2table.sql备份指定数据库排除某些表
mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.sql
常见问题
数据处理超时
当您需要导出的数据量较多时,可能会报 TIMEOUT 4012 错误。为避免这个错误您需要使用租户管理员账户登录数据库运行下述语句调整系统参数,导出完成后您可以修改回原值:
obclient> SET GLOBAL ob_trx_timeout=1000000000,GLOBAL ob_query_timeout=1000000000;