MySQL同步增量数据到OceanBase

2024年 5月 7日 18.9k 0

简介

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

环境信息

OB集群

3台 centos ( docker 环境)部署的 OB 集群,端口 2882:2881 ,服务器IP分别为 172.20.0.10、172.20.0.11、172.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; 

canal、adapter服务器

1台 centos ( docker 环境),IP地址为 172.20.0.31 ,用于部署 canal 、canal-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.gz、canal.adapter-1.1.5.tar.gz

登录 canal、adapter 服务器(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=trueusername: canalpassword: canalcanalAdapters:- instance: example # canal instance Name or mq topic namegroups:- groupId: g1outerAdapters:- name: logger- name: rdbkey: mysql1properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.url: jdbc:mysql://172.20.0.10:2881/mydb1jdbc.username: obcanal@obcp_t1jdbc.password: obcanal- name: rdbkey: mysql2properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.url: jdbc:mysql://172.20.0.10:2881/mydb2jdbc.username: obcanal@obcp_t1jdbc.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: truedatabase: 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: idmapAll: truecommitBatch: 3000


启动

~/canal-adapter/bin/startup.sh

查看日志

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

测试

过程省略

问题记录

ssl 禁用

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

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

DML不生效,DDL生效

MySQL 的 binlog 格式设置为 ROW 。

单表同步

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

表要主键或唯一键

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

相关文章

pt-kill工具的使用
pt-ioprofile工具包的使用
数据库管理-第216期 Oracle的高可用-01(20240703)
DBMS_REPAIR EXAMPLE SCRIPT WITH PARTITION
数据库事务的四大特性: ACID 
使用BBED修复损坏的SYSTEM文件头

发布评论