MySQL
同步增量数据到OceanBase
简介
简单模拟下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台MySQL
5.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=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生效
MySQL
的binlog
格式设置为ROW
。
单表同步
需要在目标端先建表,整个库同步不需要单独建表。
表要主键或唯一键
要同步的表需要有主键或唯一键
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。