暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

MySQL同步增量数据到OceanBase

原创 ziyoo0830 2021-12-15
1870

MySQL同步增量数据到OceanBase

简介

简单模拟下MySQLOB数据同步的过程,包括schema同步及单个表同步过程,仅记录操作过程。

环境信息

OB集群

3台centos(docker环境)部署的OB集群,端口2882:2881,服务器IP分别为172.20.0.10172.20.0.11172.20.0.12

# 在集群上创建一个租户 obcp_t1 ,过程略。 # 建立用户 obcanal create user obcanal@'%' identified by 'obcanal' ; GRANT ALL PRIVILEGES ON *.* TO 'obcanal' ; create database mydb1 ; # 用户测试整库同步 create database mydb2 ; # 用于测试单表同步

MySQL服务器

1台MySQL5.7,IP地址为172.20.0.32,端口3306 。

docker run --name mysql57 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=password -e TZ=Asia/Shanghai --restart=always -v /data/dockerdata/mysql1/conf:/etc/mysql -v /data/dockerdata/mysql1/datadir:/var/lib/mysql --network=adnc_net --ip 172.20.0.32 -d mysql:5.7

配置MySQL

# 在/data/dockerdata/mysql1/conf/my.cnf文件中加入内容(3个参数为必改项) [mysqld] log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL replaction 需要定义 skip_ssl # 禁用ssl ,否则jdbc无法连接

创建canal连接MySQL账户

# 授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant 。 CREATE USER canal@'%' IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;

创建测试库

create database mydb1;

canaladapter服务器

1台centos(docker环境),IP地址为172.20.0.31,用于部署canalcanal-adapter

sudo yum -y install java-1.8.0-openjdk.x86_64

docker快速构建服务器说明

docker network create --driver bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 adnc_net # 自定义网络 docker run --privileged -itd -p 2230:22 --name c10 --network adnc_net --ip 172.20.0.10 centos:7 /usr/sbin/init # 运行容器并指定IP docker exec -it c10 bash # 进入容器 # 更新centos并安装必要的软件包 yum check-update -y && yum update -y yum install initscripts screen wget -y && yum install passwd -y && yum install net-tools -y && yum install -y unzip zip && yum -y install wget tree && yum install -y sudo net-tools yum install -y openssh-server openssh-clients systemctl start sshd useradd admin # 添加admin用户 passwd admin # 修改密码

安装canal

https://github.com/alibaba/canal/releases下载的包如下:canal.deployer-1.1.5.tar.gzcanal.adapter-1.1.5.tar.gz

登录canaladapter服务器(172.20.0.31),并将上面的两个软件上传到该服务器。

# 以下命令均适用root进行。 mkdir ~/canal tar zxvf canal.deployer-1.1.5.tar.gz -C ~/canal

修改配置

# 修改/root/canal/conf/canal.properties文件,(为简洁,去除部分内容): more /root/canal/conf/canal.properties # tcp, kafka, rocketMQ, rabbitMQ canal.serverMode = tcp # 指定该值为tcp ,默认值即为tcp。
# 修改/root/canal/conf/example/instance.properties文件,修改后的内容如下(为简洁,去除部分内容): more /root/canal/conf/example/instance.properties # position info canal.instance.master.address=172.20.0.32:3306 ## 指定MySQL服务器信息 ....... # username/password canal.instance.dbUsername=canal ## 指定前面部分创建的MySQL账户名 canal.instance.dbPassword=canal ## 指定前面部分创建的MySQ账户密码

启动

/root/canal/bin/startup.sh # 如有如下报错,参考前面部分安装java环境。 bin/startup.sh: line 30: which: command not found # 这里缺少 which命令,可以 yum install -y which 安装 Cannot find a Java JDK. Please set either set JAVA or put java (>=1.5) in your PATH.

查看日志

查看 server 日志

tail -500f /root/canal/logs/canal/canal.log</pre> # 有 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ...... 表示启动成功。

查看 instance 的日志

tail -500f /root/canal/logs/example/example.log # 确保没有ERROR,并有如下信息显示(源端MySQL binlog信息) # 2021-12-15 17:25:39.346 [destination = example , address = /172.20.0.32:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=replicas-mysql-bin.000005,position=1578,serverId=100,gtid=,timestamp=1639556730000] cost : 1332ms , the next step is binlog dump

关闭命令

sh bin/stop.sh

部署 RDB 适配器

RDB adapter 用于适配MySQL到任意关系型数据库(需支持jdbc)的数据同步及导入 。

安装canal-adapter

# 以下命令均适用root进行。 mkdir ~/canal-adapter tar zvxf canal.adapter-1.1.5.tar.gz -C ~/canal-adapter/

修改配置

# more ~/canal-adapter/conf/application.yml srcDataSources: defaultDS: url: jdbc:mysql://172.20.0.32:3306/mydb1?useUnicode=true username: canal password: canal canalAdapters: - instance: example # canal instance Name or mq topic name groups: - groupId: g1 outerAdapters: - name: logger - name: rdb key: mysql1 properties: jdbc.driverClassName: com.mysql.jdbc.Driver jdbc.url: jdbc:mysql://172.20.0.10:2881/mydb1 jdbc.username: obcanal@obcp_t1 jdbc.password: obcanal - name: rdb key: mysql2 properties: jdbc.driverClassName: com.mysql.jdbc.Driver jdbc.url: jdbc:mysql://172.20.0.10:2881/mydb2 jdbc.username: obcanal@obcp_t1 jdbc.password: obcanal

增加RDB文件

# 整库同步 more ~/canal-adapter/conf/rdb/mydb1.yml ## Mirror schema synchronize config dataSourceKey: defaultDS destination: example groupId: g1 outerAdapterKey: mysql1 concurrent: true dbMapping: mirrorDb: true database: mydb1 # 库名和源库一样 # 单表同步 more ~/canal-adapter/conf/rdb/mydb2.yml dataSourceKey: defaultDS destination: example groupId: g1 outerAdapterKey: mysql2 concurrent: true dbMapping: database: mydb1 # 源库名 table: t1 # 源表名 targetTable: t2 # 目标端表名,库名在jdbc配置里。 targetPk: id: id mapAll: true commitBatch: 3000

启动

~/canal-adapter/bin/startup.sh

查看日志

tail -500f ~/canal-adapter/logs/adapter/adapter.log # 确保无错误发生

测试

过程省略

问题记录

ssl禁用

第一种方法:在源端jdbc连接串,增加&useSSL=false

第二种方法:在MySQL配置文件中加入:skip_ssl,重启MySQL生效

DML不生效,DDL生效

MySQLbinlog格式设置为ROW

单表同步

需要在目标端先建表,整个库同步不需要单独建表。

表要主键或唯一键

要同步的表需要有主键或唯一键

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论