canal-同步數據常見問題及最新部署搭建流程(mysql同步到mysql)


一、目錄

  Ⅰ  部署搭建  

    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值就行了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM