一、目錄
Ⅰ 部署搭建
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值就行了