使用CloudCanal同步MySQL到OceanBase中,数据进行全量/增量同步进行展示。
注:当前只是测试基础功能,未涉及大量生产数据。

0. ENV

0.1 基础环境
CentOS 7.6;
mysql 5.7.33;
OceanBase-CE 3.1.2(社区版,以下简称OB);
CloudCanal 2.2.0.6-alpha(社区版,以下简称CC,还未正式发布).
0.2 部署架构
mysql单机部署:192.168.80.121
OB 单机上部署3个observer部署: 192.168.80.110:2881/3881/4881,1个obproxy 2883
CC单机docker容器部署:192.168.80.120

源端Mysql数据库prod.demo 1w条记录,使用CC同步mysql的prod.demo全量和增量到目标端OB中,prod.demo -> prod.demo。
1. 前置条件

首先参考CloudCanal安装部署参考文档完成CloudCanal社区版的安装和部署,部署详见文末参考章节。
支持条件:
支持MySQL5.1.X, 5.5.X, 5.6.X,5.7.X,8.X;
目前CloudCanal 2.2.0.6-alpha为测试版本,2.2正式版将于近期发布;
目前支持OceanBase社区版3.0-3.1.2,暂不支持企业版ORACLE租户。
2. 添加数据源

登录CloudCanal平台,mysql2OB需要先创建源端mysql数据源和目标端OB数据源,再创建任务。
2.1 创建源端mysql数据源
数据源管理 -> 新增数据源 -> 自建数据库 -> MYSQL,
MYSQL 数据源设置:
网络地址: 内网,192.168.80.121:3306;
认证方式:账号密码
账号:root
密码:******
点击“测试连接”,提示“测试连接成功”即可。
描述(可选):mysql_121
点击“新增数据源”。
创建的数据源名称为:my-9l33gd33m4ghr27 (mysql_121),后续创建任务时
用到。

2.2 创建目标端OceanBase数据源
数据源管理 -> 新增数据源 -> 自建数据库 -> OceanBase,
OceanBase 数据源设置:
Client地址: 内网,192.168.80.110:2883,填写obproxy地址
认证方式:账号密码
账号:root@mysql_t1#rundba
密码:******
点击“测试连接”,提示“测试连接成功”即可。
描述(可选):[mysql2OB]-OB
点击“新增数据源”。
创建的数据源名称为:ob-z65k8sp17i8g95i(OceanBase_110),后续创建任务时用到。

3. 任务创建

3.1 创建任务前mysql测试数据准备[mysql数据库中执行]
1) 源端mysql数据库准备-prod
create database prod default character set utf8mb4 collate utf8mb4_bin;
2) 在prod数据库中创建带主键的demo表
use prod;DROP TABLE IF EXISTS demo;CREATE TABLE demo (id int not null primary key,name varchar(10));
3) 创建存储过程pro_demo
DROP PROCEDURE IF EXISTS pro_demo;DELIMITER &&CREATE PROCEDURE pro_demo(IN inr int)BEGINDECLARE i INT DEFAULT 0;START TRANSACTION;WHILE i<inr DOINSERT INTO demo(id,name) values(i,'rundba.com');SET i=i+1;END WHILE;COMMIT;END &&DELIMITER ;
4) 模拟产生1w条记录
生产1w条测试数据,可根据需求,自己指定任意记录数
call pro_demo(10000);
当前已生成1w条记录
mysql> select count(*) from prod.demo;+----------+| count(*) |+----------+| 10000 |+----------+1 row in set (0.00 sec)
5) 目标端OceanBase数据库准备-prod[OceanBase中执行]
MySQL [oceanbase]> create database prod;Query OK, 1 row affected (0.110 sec)
3.2 创建任务
添加好数据源之后可以按照如下步骤进行数据迁移、同步任务的创建。
1) 开始创建任务
任务管理 -> 创建任务
绑定集群,选择默认集群。
2) 源&目标设置
选择源库和目标库设置
[源库]
部署类型:自建数据库
源类型:mysql
网络类型:内网
源实例:选择前面创建的mysql数据源 my-9l33gd33m4ghr27(mysql_121),点击“测试连接”,直到提示成功。
字符集:utf8mb4,支持的其它mysql字符集utf8、gbk
[目标库]
部署类型:自建数据库
目标类型:OceanBase
网络类型:内网
目标实例:选择前面创建的OceanBase数据源ob-z65k8sp17i8g95i(OceanBase_110),点击“测试连接”,直到提示成功。
字符集:utf8
[数据库映射]
选择默认模式。
prod到prod同步。
点击下一步。

3) 功能配置
增量同步,默认,点击下一步。

报错处理-mysql开启binlog:

如果提示'log_bin'参数值必须为 1,则需要设置源端mysql参数:
vim /etc/my.cnf #在[mysqld]下面添加log-bin=master-a-binbinlog-format=ROWserver-id=1
启用二进制日志log-bin;
binlog格式为ROW;
设置一个全局唯一的server_id为1;
重启MySQL服务:
systemctl restart mysqld
再次确认
mysql> show variables like "%bin%";
4) 表&action过滤
默认,下一步。

注:目标端demo(待创建),不需要手工创建。
5) 数据处理
默认,下一步。

6) 创建确认
默认,创建任务。

任务创建后,会自动完成结构迁移、全量、增量阶段。
7) 创建完成

8) 同步数据确认
此时,目标端OceanBase中数据已经生成。
[admin@ob3 ~]$ obclient -h192.168.80.110 -P2883 -uroot@mysql_t1#rundba oceanbase -c -A -p'Demo_415'Welcome to the OceanBase. Commands end with ; or \g.Your MySQL connection id is 20Server version: 5.6.25 OceanBase 3.1.2 (r10000392021123010-d4ace121deae5b81d8f0b40afbc4c02705b7fc1d) (Built Dec 30 2021 02:47:29)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [oceanbase]> select count(1) from prod.demo;+----------+| count(1) |+----------+| 10000 |+----------+1 row in set (0.018 sec)

3.3 增量验证--成功
1) 源端新增一条记录
mysql> insert into demo values(10000,'mysql2ob');Query OK, 1 row affected (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)

2) 目标端查询是否成功--成功
MySQL [oceanbase]> select * from prod.demo where id >= 9999;+-------+------------+| id | name |+-------+------------+| 9999 | rundba.com || 10000 | mysql2ob |+-------+------------+2 rows in set (0.003 sec)

3) 增量排错参考
https://www.askcug.com/topic/142
3.4 更新验证--成功
1) 源端更新一条记录
mysql> update demo set name='mysql到OB' where id='10000';Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> commit;Query OK, 0 rows affected (0.00 sec)

2) 目标端查询是否成功--成功
MySQL [oceanbase]> select * from prod.demo where id = 10000;+-------+------------+| id | name |+-------+------------+| 10000 | mysql到OB |+-------+------------+1 row in set (0.007 sec)

3.5 删除验证--成功
1) 源端删除一条记录
mysql> delete from demo where id=10000;Query OK, 1 row affected (0.00 sec)

2) 目标端查询是否成功--成功
MySQL [oceanbase]> select * from prod.demo where id = 10000;Empty set (0.001 sec)MySQL [oceanbase]> select * from prod.demo where id >= 9999;+------+------------+| id | name |+------+------------+| 9999 | rundba.com |+------+------------+1 row in set (0.001 sec)

4. 小结

伴随着数据多元化、国产数据库的崛起,各种数据之间数据同步、转换、数仓构建等产生大量需求。
同步CC作为阿里系成员创业构建的一款数据同步工具,对polarDB-X、OceanBase、StarRocks等进行了支持,测试环境正常运行,大批量生产环境还有待考验,其生存并得以茁壮成长还需经历时代的考验。
5. CC支持数据源参考

按当前版本来看,截止2022-03-03,CC支持的数据源如下:
源端支持的数据源:MySQL、PostgreSQL、SQL Server、Greenplum、Oracle、Kafka、RocketMQ、RabbitMQ、MongoDB。
目标端支持的数据源:
MySQL、TiDB、PostgreSQL、Greenplum、ElasticSearch、ClickHouse、Kafka、RocketMQ、RabbitMQ、PolarDB-X、Hive、Oracle、Kudu、MongoDB、SQL Server、Redis、StarRocks、OceanBase。

6. 参考

https://doc-cloudcanal.clougence.com/quick/quick_starthttps://www.askcug.com/topic/262/5%E5%88%86%E9%92%9F%E6%90%9E%E5%AE%9Amysql-postgresql-oracle%E5%88%B0OceanBase%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E5%90%8C%E6%AD%A5-cloudcanal%E5%AE%9E%E6%88%98https://docs.OceanBase.com/zh-cn/main/loading/CloudCanal_loading
旨在交流,不足之处,还望抛砖。
作者:王坤,微信公众号:rundba,欢迎转载,转载请注明出处。
如需公众号转发,请联系wx: landnow。





