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