迁移 MySQL 数据到 OceanBase 集群
文档控制:
|
序 |
版本号 |
更改人 |
日期 |
备注 |
|
1 |
v1.0 |
岳彩磊 |
2022-02-09 |
|
|
2 |
V2.0 |
岳彩磊 |
2022-03-02 |
|
目录
1.引言
练习目的
本次练习目的掌握从 MySQL 向 OceanBase 迁移数据的基本方法:mysqldump、datax 、canal
等。
练习条件
有 服务器,内存资源至少 12G*1台 ,部署有 OceanBase 集群。
有 mysql 数据库,有少量业务表和数据(数据量不要求很多)。没有业务表和数据的就推荐使用 sysbenc、 tpcc 或者
tpch 的业务数据。
练习内容
请记录并分享下列内容:
(必选)使用 mysqldump 将 mysql的表结构和数据同步到 OceanBase 的MySQL 租户中。
(必选)使用 datax 配置至少一个表的 MySQL 到 OceanBase 的 MySQL 租户的离线同步。
(可选)使用 datax 配置至少一个表的 OceanBase 到 CSV 以及 CSV 到
OceanBase 的离线同步。
(可选)使用 canal 配置 MySQL 的增量同步到 OceanBase 的 MySQL 租户。
社区版官网-文档-学习中心-入门教程:4.2 如何使用 mysqldump 迁移 MySQL 表 OceanBase 。
社区版官网-博客-入门实战:4.2:如何使用 mysqldump 迁移 MySQL 表 OceanBase
下载地址:
https://github.com/Percona-Lab/tpcc-mysql
[root@localhost
data]# unzip tpcc-mysql-master.zip
[root@localhost
data]# cd tpcc-mysql-master
[root@localhost
tpcc-mysql-master]# ls
add_fkey_idx.sql count.sql
create_table.sql Dockerfile drop_cons.sql
load_multi_schema.sh load.sh README.md
schema2 scripts src
[root@localhost
tpcc-mysql-master]# cd src/
[root@localhost
src]# make

注:tpcc安装只需要make即可,这里不需要make install,编译完成后会生成tpcc_load和tpcc_start命令,以供之后生成测试数据。
从图中可以看出,tpcc共创建了九张表:
customer:客户表;
district:地区表;
history:历史数据表;
item:商品表;
new_orders:新订单表;
order_line:发货表;
orders:订单表;
stock:库存表;
warehouse:仓库表;
[root@localhost tpcc-mysql-master]# ./tpcc_load
-h192.168.101.86 -P3306 -uroot -d tpcc_test -w 10 -pmysql
-w表示仓库warehouse,此处一个仓库对应10个地区,每个地区对应3000用户,数据生成略微有些慢;

出现报错:./tpcc_load: error while loading
shared libraries: libmysqlclient.so.18: cannot open shared object file: No such
file or directory

解决方式:
1.
先确认/usr/local/mysql/lib/下是否有libmysqlclient.so.18这个文件.

2.
修改ld.so.conf文件
echo “/usr/local/mysql/lib”>> /etc/ld.so.conf
执行ldconfig使变更生效即可。

数据生成完成后,再创建索引。
注:一定要先生成数据再添加索引,如果先创建索引,数据生成速度会更缓慢!
root@localhost:mysql3306.sock
[tpcc_test]>source /data/tpcc-mysql-master/add_fkey_idx.sql
[root@localhost data]# mysqldump -h192.168.101.86 -uroot -P3306 -pmysql
-d tpcc_test --compact > tpcc_ddl.sql
[root@localhost data]# mysqldump -h192.168.101.86 -uroot -P3306 -pmysql
-t tpcc_test --compact > tpcc_data.sql
[tpcc_test]> source /data/tpcc_ddl.sql

[tpcc_test]> source /data/tpcc_data.sql


下载链接:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
[root@master datax]# wget
http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
解压安装包:
[root@master
datax]# tar xvzf datax.tar.gz
删除datax中的隐藏文件:
[root@master
plugin]# find /data/datax/datax/plugin -name ".*" |xargs rm -rf
运行datax自带的测试job出现报错:File '/usr/local/datax/job/job.json' does not exist

解决方式:出现报错的原因是解压路径的问题,可以做个软链接:
[root@master datax]# ln -s
/data/datax/datax /usr/local/datax
再次运行测试job
[root@master datax]# cd /usr/local/datax/
[root@master datax]# bin/datax.py
/usr/local/datax/job/job.json
测试通过:


[root@master datax]# python /usr/local/datax/bin/datax.py -r
mysqlreader -w oceanbasev10writer > /usr/local/datax/job/my2ob.json
[root@master datax]# vim job/my2ob.json
{
"job": {
"setting": {
"speed": {
"channel": 4
},
"errorLimit": {
"record": 0,
"percentage": 0.1
}
},
"content": [
{
"reader": {
"name":
"mysqlreader",
"parameter": {
"username":
"root",
"password":
"mysql",
"column": [
"*"
],
"connection":
[
{
"table": [
"new_orders"
],
"jdbcUrl": ["jdbc:mysql://192.168.101.85:3306/tpcc_test?useUnicode=true&characterEncoding=utf8"]
}
]
}
},
"writer": {
"name":
"oceanbasev10writer",
"parameter": {
"obWriteMode": "insert",
"column": [
"*"
],
"connection":
[
{
"jdbcUrl":
"jdbc:oceanbase://192.168.101.66:2883/tpcc_test?useLocalSessionState=true&allowBatch=true&allowMultiQueries=true&rewriteBatchedStatements=true",
"table": [
"new_orders"
]
}
],
"username":
"root@sys#obdemo",
"password":"root",
"writerThreadCount":10,
"batchSize":
1000,
"memstoreThreshold": "0.9"
}
}
}
]
}
}
[admin@master datax]$ bin/datax.py
/usr/local/datax/job/my2ob.json



确认两端数据同步一致,没有出现异常,迁移完成。

4.6.
Datax数据迁移过程中的报错
1、 JSON格式报错:
解决方式:参阅DataX文档,严格按照规定的格式进行修改即可;

2、 源端地址填写错误:
解决方式:排查报错,发现是端口号写错了,3306写成了3308,更改即可;

3、 用户名填写错误
解决方式:删除jdbcURL中的集群名,把username更改为root@sys#obdemo即可;

4、 数据库名称填错
解决方式:将数据库名称更改为正确的tpcc_test;
5、 写入OB时表报错;
解决方式:要提前在OB数据库中创建tpcc_test.new_orders这张表,并与MySQL数据库中表结构保持一张,可直接导入MySQL的表结构;








