使用Mysqldump导入导出OB数据

一、使用mysqldump导出OB的数据

注意事项

  • 使用 MySQLDump 仅支持导出 OceanBase 数据库 MySQL 模式实例中的数据。
  • 不支持锁库和表。
  • 当您需要导出的数据量较多时,可能会报 TIMEOUT 4012 错误。为避免这个错误您需要使用租户管理员账户登录数据库运行下述语句调整系统参数,导出完成后您可以修改回原值:
obclient> SET GLOBAL ob_trx_timeout=1000000000,GLOBAL ob_query_timeout=1000000000;

备份操作

下述示例语句展示了如何在 MySQLDump 中备份 OceanBase 数据库中的数据,运行该语句后会生成一个 SQL 格式的文件:

1.导出数据库db_test的表结构+数据
# mysqldump -h 192.168.1.150 -uroot@tpch_mysql -P2883 --skip-triggers --databases db_test --skip-extended-insert > ob-data.sql
2.导出数据库的某表
# mysqldump -h 192.168.1.150 -uroot@tpch_mysql -P2883 --skip-triggers db_test db_name > ob-data.sql

二、使用 MySQLDump 迁移 MySQL 表到 OceanBase

将表结构和数据分开导出并导入

1. 导出指定数据库的表结构(不包括数据)

1. mysql导出库db_test数据库的表结构
# mysqldump -uroot -p -S /data/mysql/mysql3400/logs/mysql.sock --set-gtid-purged=off --single-transaction --default-character-set=utf8mb4 --databases db_test -d > db_test-stru-20220507.sql
2.删除不支持的语法
(1)删除sql文件中SQL_NOTES参数相关的行
# sed -i '/SET @OLD_SQL_NOTES=/d' db_test-stru-20220507.sql
# sed -i '/SET SQL_NOTES=/d' db_test-stru-20220507.sql
(2)如果有MAX_ROWS= 的设置,则需注释掉
(3)大小写敏感问题
如果源端 MySQL 设置表名是大小写敏感,那么OB的MySQL租户也要进行同样的设置。
(4)外键约束问题
如果源端mysql有外键,在导入OB MySQL 里之前需要禁用外键检查约束,否则会报错。
MySQL [oceanbase]> set global foreign_key_checks=off;
Query OK, 0 rows affected (0.01 sec)​
3.导入脚本
(1)# mysql -h 192.168.1.150 -uroot@tpch_mysql -P2883 < db_test-stru-20220507.sql
(2)> source '/data/db_test-stru-20220507.sql';

2. 导出指定数据库的表数据(不包括结构)

1.从mysql中导出数据
# mysqldump -uroot -p -S /data/mysql/mysql3400/logs/mysql.sock --set-gtid-purged=off --single-transaction --default-character-set=utf8mb4 --databases db_test -t > db_test-data-20220507.sql
2. 删除不支持的语法
(1)删除sql文件中SQL_NOTES参数相关的行
# sed -i '/SET @OLD_SQL_NOTES=/d' db_test-data-20220507.sql
# sed -i '/SET SQL_NOTES=/d' db_test-data-20220507.sql
# sed -i '/DISABLE KEYS/d' db_test-data-20220507.sql
# sed -i '/ENABLE KEYS/d' db_test-data-20220507.sql
3.导入脚本
(1)# mysql -h 192.168.1.140 -uroot@tpch_mysql -P2883 < db_test-data-20220507.sql
(2)> source '/data/db_test-data-20220507.sql';

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

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 */;

很实用,点赞

特别靠谱的实用帖子,:+1: