Mysql主从数据同步-canal

429 阅读2分钟

开启binlog

  • 查看是否开户binlog
    SHOW VARIABLES LIKE '%log_bin%'

    log_bin: OFF表示未开启,ON表示开启

image.png

  • 若未开户binlog 则找到mysql的配置文件my.cnf,进行修改;在[mysqld]下添加如下配置
#binlog文件名
log-bin=mysql-bin
#binlog模式选择ROW
binlog-format=ROW
#mysql实例id,不能和canal的slaveId重复
server_id=1

image.png

修改完后,重启mysql systemctl restart mysqld.service

canal-deployer配置

  • 为canal-deployer创建源数据库连接账号
create user canal@'%' IDENTIFIED by 'canal123';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';

#刷新配置
FLUSH PRIVILEGES;

#如提示密码强度不足,可修改密码安全等级
#set global validate_password_policy=LOW;
  • 下载 wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz

  • 解压到指定目录 tar -zxvf canal.deployer-1.1.5.tar.gz -C canal-1.1.5/deployer

  • 修改conf/example/instance.properties配置文件
    vim conf/example/instance.properties

  • 修改内容如下,保存退出

#源数据库连接地址端口号
canal.instance.master.address=127.0.0.1:3306

#源数据库账号密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal123

#指定需要同步的数据库名
canal.instance.defaultDatabaseName=miyue
#指定需要同步的数据表
canal.instance.filter.regex=miyue\\..*

image.png

  • 启动canal-deployer ./bin/startup.sh

canal-adapter配置

  • 下载canal-adapter
    wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz
  • 解压到指定目录 tar -zxvf canal.adapter-1.1.5.tar.gz -C canal-1.1.5/adapter
  • 修改配置conf/application.yml
    vim conf/application.yml
  • 修改内容如下,保存退出
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://127.0.0.1:3306/miyue?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false
      username: canal
      password: canal123
  canalAdapters:        # 适配器列表
  - instance: example   # canal 实例名或者 MQ topic 名
    groups:             # 分组列表
    - groupId: g1       # 分组id, 如果是MQ模式将用到该值
      outerAdapters:    # 分组内适配器列表
      - name: logger    # 日志打印适配器
      - name: rdb       # 指定为rdb类型同步
        key: mysql1     # 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应
        properties:     # 目标数据库信息配置
          jdbc.driverClassName: com.mysql.jdbc.Driver
          jdbc.url: jdbc:mysql://43.100.40.10:3306/miyue?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false
          jdbc.username: target_canal
          jdbc.password: targetcanal123

image.png

  • 修改配置 conf/rdb/mytest_user.yml

    adapter将会自动加载 conf/rdb 下的所有.yml结尾的表映射配置文件

  • 完整内容如下
dataSourceKey: defaultDS  # 源数据源的key,对应application.yml中的srcDataSources.defaultDS 
destination: example      # cannal的instance或者MQ的topic, 对应application.yml中的canalAdapters.instance: example
groupId: g1               # 对应application.yml中的canalAdapters.groups.groupId: g1
outerAdapterKey: mysql1   # 对应application.yml中的canalAdapters.groups.outerAdapters.key: mysql1
concurrent: true          # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!
dbMapping:                # 两个数据库名、表名、段全一样,只配置mirrorDb、database两项即可进行schema DDL DML同步
  mirrorDb: true
  database: miyue         # 源数据库名

  • 启动canal-adapter
    ./bin/startup.sh

错误问题

1. 错误1

Could not resolve placeholder 'HOSTNAME%%.*' in value "history -a; history -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}""

image.png

  • 解决方式
    修改canal-adapter的conf/application.yml配置,增加错误提示中${}里的相关变量并赋空值,冒号后面为空;如下图改动

image.png

2. 错误2

 ERROR c.a.o.canal.parse.inbound.mysql.dbsync.DirectLogFetcher - I/O error while reading from client socket
java.io.IOException: Received error packet: errno = 1236, sqlstate = HY000 errmsg = Could not find first log file name in binary log index file
  • 登录数据库查看binlog文件 show binary logs

  • 查看binlog文件position位置 show binlog events in 'mysql-bin.000091' LIMIT 0, 50

  • 停止canal ./bin/stop.sh

  • 修改配置文件 vim conf/test/meta.dat

修改postion.journalName 为新的binlog文件名
修改postion.position 为新binglog的position位置

  • 重新重启canal ./bin/startup.sh