环境准备
- OceanBase集群部署
https://www.modb.pro/db/238891
- MySQL数据库安装
https://www.modb.pro/db/240079
- 使用tpcc工具创建业务数据
官网地址:https://github.com/Percona-Lab/tpcc-mysql
- TPCC简介
TPC(事务处理性能委员会)是由数十家会员公司创建的非盈利性组织,其功能是指定商务应用基准程序的标准规范、性能和价格度量,并管理测试结果的发布。 TPC-C是TPC推出的一系列性能测试标准中的一款,其测试用到的模型是一个大型的商品批发销售公司,拥有若干个分布在不同区域的商品仓库。
- 上传tpcc工具
sftp:/tmp> put F:\system\mysql\Packages\tpcc-mysql-master.zip Uploading tpcc-mysql-master.zip to remote:/tmp/tpcc-mysql-master.zip
- 编译安装
[root@localhost ~]# cd /tmp/ [root@localhost tmp]# unzip tpcc-mysql-master.zip [root@localhost tmp]# cd tpcc-mysql-master/ [root@localhost tpcc-mysql-master]# cd src/ [root@localhost src]# make cc -w -O3 -g -I. `mysql_config --include` -c load.c <......> cc main.o spt_proc.o driver.o support.o sequence.o rthist.o sb_percentile.o neword.o payment.o ordstat.o delivery.o slev.o `mysql_config --libs_r` -lrt -o ../tpcc_start [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 tpcc_load tpcc_start
- 加载数据
**创建数据库**
[root@localhost ~]# mysqladmin -uroot -p create tpcc
Enter password:
[root@localhost ~]#
**导入建表语句**
mysql> use tpcc
Database changed
mysql> source /tmp/tpcc-mysql-master/create_table.sql
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+----------------+
| Tables_in_tpcc |
+----------------+
| customer |
| district |
| history |
| item |
| new_orders |
| order_line |
| orders |
| stock |
| warehouse |
+----------------+
9 rows in set (0.00 sec)
**加载数据**
[root@localhost tpcc-mysql-master]# ./tpcc_load -h127.0.0.1 -P3306 -d tpcc -uroot -p -w 1
...DATA LOADING COMPLETED SUCCESSFULLY.
mysql> use tpcc
Database changed
mysql> select count(*) from orders;
+----------+
| count(*) |
+----------+
| 30000 |
+----------+
1 row in set (0.01 sec)
使用mysqldump迁移数据
mysql数据库数据导出
- 导出指定数据库的表结构(不包括数据)
[root@localhost ~]# mysqldump -h192.168.66.5 -uroot -P3306 -prootPWD123 -d tpcc --compact > tpcc_ddl.sql [root@localhost ~]# cd /mysql/data/sqldump/ [root@localhost sqldump]# ls tpcc_ddl.sql
- 导出指定数据库的表数据(不包括结构)
[root@localhost ~]# mysqldump -h192.168.66.5 -uroot -P3306 -prootPWD123 -t tpcc > /mysql/data/sqldump/tpcc_data.sql [root@localhost ~]# cd /mysql/data/sqldump/ [root@localhost sqldump]# ls tpcc_data.sql tpcc_ddl.sql
将mysql数据同步到OB mysql租户
- 拷贝mysqldump文件到OBPROXY服务器
[root@localhost sqldump]# scp tpcc_d* root@192.168.66.4:/tmp/sqldump/
- 连接到mysql租户并创建测试数据库
[root@localhost ~]# obclient -h192.168.66.4 -uroot@obmysql#obdemo -P2883 -prootPWD123 -c -A MySQL [(none)]> create database tpcc; Query OK, 1 row affected (0.082 sec) MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | oceanbase | | information_schema | | mysql | | test | | yaya | | tpcc | +--------------------+ 6 rows in set (0.004 sec)
- 导入表结构
[root@localhost ~]# obclient -h192.168.66.4 -uroot@obmysql#obdemo -P2883 -prootPWD123 -c -A tpcc MySQL [tpcc]> source /tmp/sqldump/tpcc_ddl.sql Query OK, 0 rows affected (0.002 sec) 注: 在导出的表结构语句里,可能包含外键,在导入OceanBase MySQL里时,如果外键依赖的表没有创建时,导入脚本会报错,因此在导入之前需要将外键检查约束先禁用掉。 **禁用外键检查约束** [root@localhost ~]# obclient -h192.168.66.4 -uroot@obmysql#obdemo -P2883 -prootPWD123 -c -A tpcc MySQL [tpcc]> set global foreign_key_checks=off; Query OK, 0 rows affected (0.178 sec) MySQL [tpcc]> show global variables like '%foreign%'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | foreign_key_checks | OFF | +--------------------+-------+ 1 row in set (0.009 sec) 修改后退出会话,重新登录生效。
- 导入表数据
[root@localhost admin]# obclient -h192.168.66.4 -uroot@obmysql#obdemo -P2883 -proot MySQL [tpcc]> source /home/admin/tpcc_data.sql Query OK, 0 rows affected (0.001 sec) 注: 从MySQL导出的脚本中会有一些特别的语法OceanBase MySQL无法支持,导入时会报错,但是不影响,如变量SQL_NOTES,DEFINER语句等。
使用DATAX迁移MySQL数据到OceanBase
DATAX介绍
DataX是阿里开源的一款使用产品,是阿里云DataWorks数据集成的开源版本,在阿里集团内被广泛使用的离线数据同步工具/平台。
DataX实现了包括OceanBase、MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS等各种异构数据源之间高效的数据同步功能,在本次实验中即看到MySQL数据库数据同步至OceanBase数据库的整个配置过程。
DATAX以任务的形式迁移数据,每个任务只处理一个表,每个任务有一个json格式的配置文件。配置文件中会包含reader和writer两节,具体的reader和writer都是DataX支持的数据库插件。
部署DATAX
- 下载DATAX工具包:datax下载地址
- 解压至本地某个目录
[root@localhost software]# tar -xzvf datax.tar.gz [root@localhost software]# ls datax datax.tar.gz [root@localhost software]# cd datax [root@localhost datax]# ls bin conf job lib log log_perf plugin script tmp
数据迁移
- 生成迁移模板文件
[root@localhost datax]# cd bin/ [root@localhost bin]# python datax.py -r mysqlreader -w oceanbasev10writer > ../job/mysql2ob.json [root@localhost bin]# cd ../job [root@localhost job]# ls job.json mysql2ob.json
- 修改模板文件
[root@localhost job]# vi mysql2ob.json { "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "column": ['*'], "connection": [ { "jdbcUrl": ["jdbc:mysql://192.168.66.5:3306/tpcc"], "table": ["history"] } ], "password": "rootPWD123", "username": "root" } }, "writer": { "name": "oceanbasev10writer", "parameter": { "column": ["*"], "connection": [ { "jdbcUrl": "||_dsc_ob10_dsc_||obdemo:obmysql||_dsc_ob10_dsc_||jdbc:mysql://192.168.66.4:2883/tpcc?useUnicode=true&characterEncoding=utf-8", "table": ["history"] } ], "obWriteMode": "replace", "password": "rootPWD123", "username": "root" } } } ], "setting": { "speed": { "channel": "1" } } } } 注:参数解析 jdbcUrl:源目数据库的连接信息,reader中包含了mysql的地址和端口以及库名,writer中包含了ob的集群、租户、obproxy的地址和端口以及库名。 table:源目表的表名称,支持写入一个或多个表,表名中一般不含库名,当配置多张表时,必须确保所有表结构保持一致。 column:源目表中需要读取和写入数据的字段,字段间使用英文逗号分隔。 username:访问mysql及oceanbase的用户名,注意oceanbase中不需要配置ob的集群名和租户名。 password:访问数据库用户名的密码。 channel:并发数,理论上并发越大,迁移性能越好,实例也要考虑源端的读压力、网络传输性能以及目标端的写入性能。
- 启动同步作业
[root@localhost datax]# python ./bin/datax.py ./job/mysql2ob.json <......> 2022-02-14 17:29:09.717 [job-0] INFO JobContainer - 任务启动时刻 : 2022-02-14 17:28:58 任务结束时刻 : 2022-02-14 17:29:09 任务总计耗时 : 11s 任务平均流量 : 113.78KB/s 记录写入速度 : 3000rec/s 读出记录总数 : 30000 读写失败总数 : 0
使用DATAX配置OceanBase与CSV间表的离线同步
MySQL数据导出到CSV文件
- 添加配置文件
[root@localhost job]# vi mysql2csv.json { "job": { "setting": { "speed": { "channel": 4 }, "errorLimit": { "record": 0, "percentage": 0.1 } }, "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "root", "password": "rootPWD123", "column": [ "*" ], "connection": [ { "table": [ "customer" ], "jdbcUrl": ["jdbc:mysql://192.168.66.5:3306/tpcc?useUnicode=true&characterEncoding=utf8"] } ] } }, "writer": { "name": "txtfilewriter", "parameter": { "path": "/tmp/datax/", "fileName": "customer", "encoding": "UTF-8", "writeMode": "truncate", "dateFormat": "yyyy-MM-dd hh:mm:ss" , "nullFormat": "\\N" , "fileFormat": "csv" , "fieldDelimiter": "," } } } ] } }
- 将MySQL数据导出
[root@localhost datax]# python ./bin/datax.py ./job/mysql2csv.json <......> 2022-02-14 21:21:48.808 [job-0] INFO JobContainer - 任务启动时刻 : 2022-02-14 21:21:38 任务结束时刻 : 2022-02-14 21:21:48 任务总计耗时 : 10s 任务平均流量 : 1.53MB/s 记录写入速度 : 3000rec/s 读出记录总数 : 30000 读写失败总数 : 0
CSV文件导入到OceanBase
- 添加配置文件
[root@localhost job]# vi csv2ob.json { "job": { "setting": { "speed": { "channel": 4 }, "errorLimit": { "record": 0, "percentage": 0.1 } }, "content": [ { "reader": { "name": "txtfilereader", "parameter": { "path": ["/tmp/datax/"], "fileName": "customer", "encoding": "UTF-8", "column": ["*"], "dateFormat": "yyyy-MM-dd hh:mm:ss" , "nullFormat": "\\N" , "fieldDelimiter": "," } }, "writer": { "name": "oceanbasev10writer", "parameter": { "obWriteMode": "insert", "column": [ "*" ], "preSql": [ "truncate table customer" ], "connection": [ { "jdbcUrl": "||_dsc_ob10_dsc_||obdemo:obmysql||_dsc_ob10_dsc_||jdbc:oceanbase://192.168.66.4:2883/tpcc?useLocalSessionState=true&allowBatch=true&allowMultiQueries=true&rewriteBatchedStatements=true", "table": [ "customer" ] } ], "username": "root", "password":"rootPWD123", "writerThreadCount":10, "batchSize": 1000, "memstoreThreshold": "0.9" } } } ] } }
- 运行配置文件
[root@localhost datax]# python ./bin/datax.py ./job/csv2ob.json <......> 2022-02-14 21:35:23.350 [job-0] INFO JobContainer - 任务启动时刻 : 2022-02-14 21:35:12 任务结束时刻 : 2022-02-14 21:35:23 任务总计耗时 : 11s 任务平均流量 : 1.56MB/s 记录写入速度 : 3000rec/s 读出记录总数 : 30000 读写失败总数 : 0
问题解决
使用tpcc工具加载数据报错
加载数据时可能会提示缺少libmysqlclient.so.20:
./tpcc_load: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory
通过find能找到这个文件,所以只是查找库文件时没有找到该路径:
[root@localhost ~]# find / -name libmysqlclient.so.20 /mysql/app/mysql-5.7.37-linux-glibc2.12-x86_64/lib/libmysqlclient.so.20
解决方法,可以创建软链接:
[root@localhost tmp]# ln -s /mysql/app/mysql-5.7.37-linux-glibc2.12-x86_64/lib/libmysqlclient.so.20 /usr/lib/ 重新加载即可: [root@localhost usr]# ldconfig -v
数据迁移时报错
启动同步作业时报如下错误:
[root@localhost datax]# python ./bin/datax.py ./job/mysql2ob.json DataX (DATAX-OPENSOURCE-3.0), From Alibaba ! Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved. 2022-02-14 17:28:16.596 [main] WARN ConfigParser - 插件[mysqlreader,oceanbasev10writer]加载失败,1s后重试... Exception:Code:[Common-00], Describe:[您提供的配置文件存在错误信息,请检查您的作业配置 .] - 配置信息错误,您提供的配置文件[/software/datax/plugin/writer/._oraclewriter/plugin.json]不存在. 请检查您的配置文件. 2022-02-14 17:28:17.615 [main] ERROR Engine - 经DataX智能分析,该任务最可能的错误原因是: com.alibaba.datax.common.exception.DataXException: Code:[Common-00], Describe:[您提供的配置文件存在错误信息,请检查您的作业配置 .] - 配置信息错误,您提供的配置文件[/software/datax/plugin/writer/._oraclewriter/plugin.json]不存在. 请检查您的配置文件. at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:26) at com.alibaba.datax.common.util.Configuration.from(Configuration.java:95) at com.alibaba.datax.core.util.ConfigParser.parseOnePluginConfig(ConfigParser.java:153) at com.alibaba.datax.core.util.ConfigParser.parsePluginConfig(ConfigParser.java:134) at com.alibaba.datax.core.util.ConfigParser.parse(ConfigParser.java:63) at com.alibaba.datax.core.Engine.entry(Engine.java:137) at com.alibaba.datax.core.Engine.main(Engine.java:204)
解决方法:
._oraclewriter文件为隐藏文件,产生该问题的原因是之前操作过reader和writer目录,系统会自动生成这些隐藏文件,需要手动删除它们,即可成功运行同步作业。
参考文档
最后修改时间:2022-02-23 15:42:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




