作者简介:赵志勇, oracle 、 mysql DBA。
1. 简介
基于 OceanBase 兼容 MySQL 大部分特性的功能,简单实验下 MySQL 整库数据迁移到 OceanBase 数据库的过程,并记录实验过程。
注:迁移过程分两个步骤,首先迁移表结构,然后再迁移表数据。
注:本次未使用 obproxy。
2. 环境准备
2.1. OceanBase
已准备好一个3节点的 OceanBase 集群(开源3.1.1版本),并建立了业务租户 obcp_t1 。搭建过程及业务租户操作等可参考官方文档或官方入门教程,地址:https://open.oceanbase.com。
如下图,红色方框部分均有相关的搭建过程介绍。
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 ;
# 从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
# 登录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 ;
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 ;
# 导出指定数据库的表数据(不包括结构)
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.1. 导入表结构
# 登录OB业务租户,并创建相应的业务库。
mysql -uroot@obcp_t1 -h172.20.0.10 -P2881 -A -c -p
create database tpccob ;
use tpccob
# 执行导入
source tpcc.sql ;
# 登录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 ;
# 在导出的表结构语句里,可能包含外键。在导入 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)
### 警告信息,实际操作过程发现不影响导入,可忽略。
### 也可以将相关内容删除。
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
加入直播群方式二:
扫码下方二维码加入