一、目录
Ⅰ 部署搭建
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
2.创建多个rdb下的yml文件
touch mytest_{1..30}.yml
3.修改每一个yml文件
4.注意事项:所属组id不用更改,只需修改所属组下的key值就行了