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

  • 相关阅读:
    JPA条件查询时间区间用LocalDateTime的问题
    Java常用的异常类型
    Android 通用流行框架
    html图标插件
    炫酷科技
    使用zxing生成二维码
    八款常见的Android游戏引擎
    opengl es中不同的绘制方式
    Xml序列化去掉命名空间,去掉申明
    win8 app GridView点击子项布局变更
  • 原文地址:https://www.cnblogs.com/tcarry/p/13668579.html
Copyright © 2020-2023  润新知