使用 mysqldump 迁移 MySQL 数据到 OceanBase

2024年 5月 7日 41.7k 0

作者简介:赵志勇, oracle 、 mysql DBA。

1.    简介

基于 OceanBase 兼容 MySQL 大部分特性的功能,简单实验下 MySQL 整库数据迁移到 OceanBase 数据库的过程,并记录实验过程。

注:迁移过程分两个步骤,首先迁移表结构,然后再迁移表数据。

注:本次未使用 obproxy。

2.    环境准备

2.1.  OceanBase

已准备好一个3节点的 OceanBase 集群(开源3.1.1版本),并建立了业务租户 obcp_t1 。搭建过程及业务租户操作等可参考官方文档或官方入门教程,地址:https://open.oceanbase.com。

如下图,红色方框部分均有相关的搭建过程介绍。

使用 mysqldump 迁移 MySQL 数据到 OceanBase-1

2.2.  MySQL

版本8.0.27,搭建过程省略,具体可参见 MySQL 官方文档,详见:https://dev.mysql.com/doc/。

2.2.1.  测试数据准备

本次使用 tpcc-mysql 来准备数据, github 地址:https://github.com/Percona-Lab/tpcc-mysql。

2.2.1.1.       编译 tpcc-mysql

  # 从github上下载tpcc-mysql源码
git clone https://github.com/Percona-Lab/tpcc-mysql.git
cd tpcc-src
make # 编译 
## 可能会报如下错误:
cc -w -O3 -g -I. `mysql_config --include` -c load.c
load.c:19:19: fatal error: mysql.h: No such file or directory
 #include <mysql.h>
                  ^
compilation terminated.
make: *** [load.o] Error 1
# 安装 mysql-devel 包。
# yum install -y mysql-devel
重新编译。
# 编译后的文件如下:
 
$ ls
add_fkey_idx.sql create_table.sql drop_cons.sql        load.sh README.md scripts tpcc_load
count.sql        Dockerfile       load_multi_schema.sh l.sh    schema2   src     tpcc_start

 2.2.1.2.       生成测试数据

  # 登录mysql,创建数据库tpcc;
mysql -uroot -p 
create database tpcc ;
use tpcc ;
 
mysql -uroot -p tpcc < create_table.sql -- 导入tpcc表结构
mysql -uroot -p tpcc < add_fkey_idx.sql -- 创建主外键索引 
 
#1.加载数据
./tpcc_load -h 127.0.0.1 -P 3306 -d tpcc -u root -p “********” -w 10 --单进程加载
n 看到” ...DATA LOADING COMPLETED SUCCESSFULLY.”就表示加载完成了,可通过”show tables”命令查看相关的表信息。
 
 
#2.也可使用多进程加载,实例如下:
sh load.sh [dbname] [warehouse]
sh load.sh tpcc100 100
注意:多进程加载过程会消耗大量的服务器资源 。

 3.    mysqldump 导出整库数据

3.1.  导出表结构

  mysqldump -h 127.1 -uroot -P3306 -p -d tpcc --compact > tpcc.sql
 
# 查看tpcc.sql文件,替换掉OB不支持的内容。
## 具体不支持内容可参考官方文档内容或咨询OB技术支持。
 
## 本次发现的不支持内容如下:
1.ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
### 解决方法:使用vi批量替换:%s/COLLATE=utf8mb4_0900_ai_ci;/; --COLLATE=utf8mb4_0900_ai_ci/g
 
2. Warning (Code 1286): Unknown storage engine 'InnoDB'
Query OK, 0 rows affected (0.00 sec)  
### 警告信息,实际操作过程发现不影响导入,可忽略。
### 也可以将相关内容删除。

 3.2.  导出表数据

  # 导出指定数据库的表数据(不包括结构)
mysqldump -h 127.1 -uroot -P3306 -p -t tpcc > tpcc_data.sql
 
# 查看tpcc_data.sql文件,为减少导入出错,建议只只保留insert语句部分,其他删除。
## 如下面这些内容,可删除,避免导入过程报错 。
-- MySQL dump 10.13 Distrib 8.0.27, for Linux (x86_64)
--
-- Host: 127.1   Database: tpcc
-- ------------------------------------------------------
-- Server version      8.0.27
 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;

 4.    导入数据到 OceanBase

4.1.  导入表结构

  # 登录OB业务租户,并创建相应的业务库。
mysql -uroot@obcp_t1 -h172.20.0.10 -P2881 -A -c -p
create database tpccob ;
use tpccob
# 执行导入
source tpcc.sql ;

 

4.2.  导入表数据

  # 在导出的表结构语句里,可能包含外键。在导入 OceanBase MySQL 里时,如果外键依赖的表没有创建时,导入脚本会报错。因此导入之前需要将外键检查约束先禁用掉。
set global foreign_key_checks=off;
source tpcc_data.sql ;

 

5.    数据验证

此部分内容略。

6.    问题记录

1、 导出内容中部分语法不完全兼容,需要提前做处理,本次遇到的如下:
  
  1.ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
### 解决方法:使用vi批量替换:%s/COLLATE=utf8mb4_0900_ai_ci;/; --COLLATE=utf8mb4_0900_ai_ci/g
 
2. Warning (Code 1286): Unknown storage engine 'InnoDB'
Query OK, 0 rows affected (0.00 sec)  
### 警告信息,实际操作过程发现不影响导入,可忽略。
### 也可以将相关内容删除。

 

2、 导出 OceanBase 有 “ERROR 4012 (HY000): Timeout” 报错

具体影响未知。如有类似报错,可一起讨论。

需要设置 ob_trx_timeout ?

7.    感想

由于 OceanBase 兼容 MySQL 大部分内容,实际操作与 MySQL 到 MySQL 库的操作过程类似,但过程中还是会发现一些不兼容的部分,由于实验过程数据量较小,未必能发现全部的问题,使用该方法迁移生产环境的数据需要更多的检查和验证过程。

OceanBase 社区版入门到实战教程直播正在进行中~

快和小伙伴一起进群交流学习吧~

加入直播群方式一:

钉钉群号 3255 4020

加入直播群方式二:

扫码下方二维码加入

使用 mysqldump 迁移 MySQL 数据到 OceanBase-2

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论