canal mysql5.7_canal-同步数据常见问题及最新部署搭建流程(mysql同步到mysql)

本文档详细介绍了如何使用Canal从MySQL5.7源数据库同步数据到另一个MySQL5.7目标数据库,包括环境准备、配置调整、错误处理等关键步骤。在配置过程中,涉及到源数据库开启binlog、Canal服务端和客户端的配置、以及解决中文乱码和字段大小写问题。此外,还提到了一些常见错误的排查方法,如数据库连接问题。
摘要由CSDN通过智能技术生成

一、目录

Ⅰ  部署搭建

1.1 环境准备

1.2 配置调整

1.3 常见报错处理

Ⅱ  避坑指南

2.1 同步的中文乱码问题

2.2 字段大小写不自动区分的问题

2.3 Load canal adapter: rdb failed问题

1.1  部署搭建——环境准备

源数据库:mysql5.7(我自己用的是docker pull过来的版本)

目标输出数据库:mysql5.7(也是docker pull过来的)

docker pull mysql:5.7

canal.deployer-1.1.5-SNAPSHOT.tar.gz(服务端版本)

wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.deployer-1.1.5-SNAPSHOT.tar.gz

canal.adapter-1.1.5-SNAPSHOT.tar.gz(客户端版本)

wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.adapter-1.1.5-SNAPSHOT.tar.gz

canal下好后解压(需要自己创建目标文件夹,压缩包里不自带)

tar zxvf canal.adapter-1.1.5-SNAPSHOT.tar.gz -C /data/canal-adapter-1.5

tar zxvf canal.adapter-1.1.5-SNAPSHOT.tar.gz -C /data/canal-deployer-1.5

1.2  部署搭建——配置调整

① 源数据库调整

源数据库开启binlog,先拷出docker里的配置文件

docker cp mysql:./etc/mysql/mysql.conf.d/mysqld.cnf \

/data/mysql/mysqld.cnf

vim编辑配置文件

vim /data/mysql/mysqld.cnf

追加配置

[mysqld]

#binlog数据中包含server_id,标识该数据是由那个server同步过来的

server-id = 1

#mysql向文件名前缀添加数字后缀来按顺序创建二进制日志文件如mysql-binlog.000006

log-bin = /var/lib/mysql/mysql-bin

#选择基于行的日志记录方式

binlog_format = ROW

拷回docker里

docker cp /data/mysql/mysqld.cnf \ mysql:./etc/mysql/mysql.conf.d/mysqld.cnf

重启容器

docker restart mysql

直登数据库验证

docker exec -it mysql bash

mysql -uroot -p

验证是否成功开启binlog,第一行log_bin显示为ON表示开启成功

show variables like 'bin_log%';

创建canal所需数据库账号及给账号授权允许查看binlog

CREATE USER 'canal'@'%' IDENTIFIED BY 'canal';

GRANT SHOW VIEW, SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

FLUSH PRIVILEGES;

② canal服务端修改

vim /data/canal-deployer-1.5/conf/example/instance.properties

#################################################

## mysql serverId , v1.0.26+ will autoGen

# canal.instance.mysql.slaveId=0

# enable gtid use true/false

canal.instance.gtidon=false

# position info

canal.instance.master.address=192.168.1.112:3306 #这里修改为源库的地址

canal.instance.master.journal.name=

canal.instance.master.position=

canal.instance.master.timestamp=

canal.instance.master.gtid=

# rds oss binlog

canal.instance.rds.accesskey=

canal.instance.rds.secretkey=

canal.instance.rds.instanceId=

# table meta tsdb info

canal.instance.tsdb.enable=true

#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb

#canal.instance.tsdb.dbUsername=canal

#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =

#canal.instance.standby.journal.name =

#canal.instance.standby.position =

#canal.instance.standby.timestamp =

#canal.instance.standby.gtid=

# username/password

canal.instance.dbUsername=canal #这里修改对应的账号,默认为canal

canal.instance.dbPassword=canal #这里修改对应的密码,默认为canal

③ canal客户端修改

vim canal-adapter-1.5/conf/application.yml

srcDataSources:

defaultDS:

url: jdbc:mysql://192.168.1.112:3306/over?useUnicode=true #源数据库,注意over,这里是填源库的库名

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://192.168.1.24:3309/go?useUnicode=true #目标数据库,注意go,这里是填目标库的库名

jdbc.username: root

jdbc.password: 111111

vim canal-adapter-1.5/conf/rdb/mytest_user.yml

dataSourceKey: defaultDS

destination: example

groupId: g1

outerAdapterKey: mysql1

concurrent: true

dbMapping:

database: over #源数据库

table: pipe_gallery #源表

targetTable: ex_zhgl_pipe_gallery #目标表

targetPk:

id: ID #源表和目标表的主键对应关系

# mapAll: true

caseInsensitive: true #这一项默认是false,需要自己添加上去,是为了区分源库和目标库表字段大小写问题

targetColumns: #源表字段和目标表字段对应关系

id: ID

gallery_name: GALLERY_NAME

build_unit: BUILD_UNIT

construction_unit: CONSTRUCTION_UNIT

design_unit: DESIGN_UNIT

supervisor_unit: SUPERVISOR_UNIT

operate_unit: OPERATE_UNIT

length: LENGTH

complete_time: COMPLETE_TIME

operate_time: OPERATE_TIME

province: PROVINCE

city: CITY

county: COUNTY

address: ADDRESS

contact_person: CONTACT_PERSON

phone: PHONE

image: IMAGE

create_time: CREATE_TIME

create_by: CREATE_BY

update_time: UPDATE_TIME

update_by: UPDATE_BY

is_delete: IS_DELETE

etlCondition: "where c_time>={}"

commitBatch: 3000 # 批量提交的大小

1.3  部署搭建——常见报错

① canal服务端数据库怎么都连不上

1.检查服务端的配置文件,将127.0.0.1:3306修改为实际ip地址+端口号,修改后回到bin目录重启程序

2.使用的canal用户是否已经授予并刷新了查看binlog的权限

② canal客户端数据库怎么都连不上

1.检查库和表对应的字符集,必须为相同的(1.1.3版本有碰到过这个问题)

2.是否启动了多个客户端程序

2.1  避坑指南——同步的中文乱码问题

这个原因是因为mysql初始化安装时默认的系统字符集为latin,所以需要修改源数据库和目标数据库的系统字符集

从docker里拷出配置文件

docker cp mysql:./etc/mysql/mysql.conf.d/mysqld.cnf \

/data/mysql/mysqld.cnf

追加配置 vim  /data/mysql/mysqld.cnf

[mysqld]

character_set_server=utf8

[client]

default-character_set=utf8

[mysql]

default-character_set=utf8

拷回docker

docker cp /data/mysql/mysqld.cnf \ mysql:./etc/mysql/mysql.conf.d/mysqld.cnf

重启容器

注意:源库和目标库最好都修改下

2.2  避坑指南——字段大小写不自动区分的问题

这个在1.1.4还是1.1.5版本作者修复了这个bug,并将它设置为了可开关项,最好下1.1.5的版本

vim canal-adapter-1.5/conf/rdb/mytest_user.yml

dataSourceKey: defaultDS

destination: example

groupId: g1

outerAdapterKey: mysql1

concurrent: true

dbMapping:

database: over

table: pipe_gallery

targetTable: ex_zhgl_pipe_gallery

targetPk:

id: ID

# mapAll: true

caseInsensitive: true #这一项默认是false,需要自己添加上去,是为了区分源库和目标库表字段大小写问题

targetColumns:

id: ID

2.3  Load canal adapter: rdb failed问题

这个问题好像非常的坑,问题出现的情况:①rdb中的key值加了特殊符号,②一个rdb的yml文件对应了多个key

所以解决的思路是:①将所有key值修改为默认的mysql+序号,如mysql1,mysql2,②创建多个rdb的yml文件,每个rdb中只包含一个源库和目标库的对应规则

1.修改application.yml文件

vim /data/canal-adapter/conf/application.yml

1d019188d1059ad4eaf1584514b0895b.png

2.创建多个rdb下的yml文件

touch mytest_{1..30}.yml

e3933d2ae8ab3d18ce1f302a5aef745e.png

3.修改每一个yml文件

361aaa2b9e50a42ebf9c2af9b4475633.png

4.注意事项:所属组id不用更改,只需修改所属组下的key值就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值