- MySQL Bin-log开启
- 进入mysql容器 docker exec -it mysql5.7 bash
- 开启mysql的binlog cd /etc/mysql/mysql.conf.d
- vi mysqld.cnf #在文件末尾处添加如下配置(如果没有这个文件就创建一个)
[mysqld] # 开启 binlog log-bin=mysql-bin #log-bin=/var/lib/mysql/mysql-bin #或者配置绝对路径 # 选择 ROW 模式 binlog-format=ROW # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复 server-id=999
- 创建账号并授权
#授权canal链接MySQL,账号具有作为MySQL slave的权限, 如果已有账户可直接 grant。 create user canal@'%' IDENTIFIED by 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
- 重启mysql并查看
docker restart mysql5.7 show variables like '%log_bin%'
- Canal安装
docker pull canal/canal-server #拉取镜像,最新版本 docker run -p 11111:11111 --name canal -d docker.io/canal/canal-server #运行容器 配置canal-server docker exec -it canal bash vi canal-server/conf/canal.properties #将它的canal.id属性修改成和mysql数据库中server-id不同的值 vi canal-server/conf/example/instance.properties #配置要监听的数据库服务地址和监听数据变化的数据库以及表
canal.instance.master.address=192.168.10.100:3306 #监听的数据库 canal.instance.filter.regex=seckill_goods.tb_sku #监听的表 mysql 数据解析关注的表,Perl正则表达式. 多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\) 常见例子: 1. 所有表:.* or .*\\..* 2. canal schema下所有表: canal\\..* 3. canal下的以canal打头的表:canal\\.canal.* 4. canal schema下的一张表:canal.test1 5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔) 注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
查看日志
docker exec -it canal -bash tail -f canal-server/logs/example/example.log
注意,如果连接的是mysql8.x,会报如下错误:
Caused by: java.io.IOException: caching_sha2_password Auth failed
解决办法是参考:
caching_sha2_password 是 MySQL 8.0 引入的默认认证插件,替代了之前的 mysql_native_password。当客户端使用旧的认证机制尝试连接到 MySQL 服务器时,就可能出现 “auth failed” 错误。 解决: mysql> ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal'; mysql> FLUSH PRIVILEGES;