不知道有多少人用过 canal 碰巧也遇到过这个奇葩问题
今天做了一天的测试,这个问题遇到的次数不算多,只有 4 次。
怎么触发的都不清楚,log 也看不出来什么问题。包括阿里给的 demo 也有这个问题
手动执行 update sql
mysql> update hello set context='testtest' where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
然而 canal 监控不到,控制台什么都没输出,甚至是 canal 的 log 里啥有用的信息都没 一开始猜的的是 mysql 空闲时间导致的数据库断连,执行 sql 主库日志并不会有变化,所以 canal 没有监控到主库日志的消费变化,后来发现空闲时间是 480 分钟,并不符合猜想。github 上看了半天工单也没找到类似的问题。
现在生产环境不敢上,还得用老一套的 trigger 来同步。郁闷死了
这几天一直在测试,但始终无法复现上周五出现的情况
虽然问题没复现出来,但这几天dbug下来猜测出几种情况,给后来的同学做个参考
1
ChrisFreeMan 2021-09-10 17:12:58 +08:00
求头像出处
|
2
joApioVVx4M4X6Rf 2021-09-10 17:16:11 +08:00
求头像出处
|
3
PeterYang1996 2021-09-10 17:17:09 +08:00
头像不错
|
4
joApioVVx4M4X6Rf 2021-09-10 17:17:34 +08:00
你这个不是 autocommit 吧?得 commit 一下才会有 log ?
|
6
BadCat OP 在想会不会是 mysql 锁的问题,但是也经不起推敲,canal 是监控 log,不是监控数据
|
7
shanghai1943 2021-09-10 17:37:00 +08:00
binlog 没开?
|
8
pkoukk 2021-09-10 17:38:26 +08:00
实际内容没变?
|
9
jiezhi 2021-09-10 17:40:12 +08:00
自己先在 mysql 里看下 binlog 情况呢,确定 mysql binlog 没问题再排查 canal 的问题
|
10
BadCat OP @shanghai1943
@jiezhi 可能我前面没表达清楚,我仔细说一下。 正常情况下 canal 是可以订阅到 mysql 数据变化情况的。但闲置个 5 、6 分钟再做新增修改或删除会有订阅不到数据变化的情况。所以我一开始猜测会不会是 mysql 的空闲时间导致连接断掉,sql 没有执行成功,所以 canal 没有消息返回。但我去看了下配置,给的 wait_timeout 时间有 480 分钟,足够了。而且这个情况直碰到了几次,很难复现 |
12
BadCat OP general_log
2021-09-10T09:11:36.830419Z 6 Query update hello set context='testtest' where id=1 meta.log 2021-09-10 17:11:37.699 - clientId:1001 cursor:[mysql-bin.000005,1613,1631265096000,1,] address[activate.navicat.com/127.0.0.1:3306] log 中看不到问题,但 canal 中没有产生订阅消息。 再执行一次 sql,canal 就会监控到信息并输出 |
13
jiezhi 2021-09-10 18:30:58 +08:00
@BadCat #10 确保该条消息 mysql 有 binlog 出来的话,建议 canal log 调成 debug 模式看看
|
14
BadCat OP @jiezhi 在家里 debug 一晚上,程序运行正常,问题复现不出来,现在猜测是还公司的 mysql 有问题。周一回去搞台新机器再看吧
|
15
BadCat OP **这几天一直在测试,但始终无法复现上周五出现的情况**
虽然问题没复现出来,但这几天 dbug 下来猜测出几种情况,给后来的同学做个参考 - 动态 ip 。 - 使用 canal admin 停启服务。demo 本身运行两天没有问题,直到我加了 canal admin 管理服务,停启几次后出现了这个问题。但是最近的测试没有复现出来。所以 canal admin 出现的问题不太大。 - journal.name=mysql-bin.000001 。可能是因为我配置了指定的 binlog 文件,当 mysql 产生新的 binlog 文件 canal 没法监控到? - wsl 的 MySQL 于 Windows 的 MySQL 冲突。很简单,修改 bind-address 就可以用 localhost/127.0.0.1 随便连 wsl 或 win 的数据库。这个我要重点说一下,我的代码是运行在 win 下,canal 服务和数据库是部署在 wsl 下,周五的具体情况记不清了,两个系统下的 mysql 服务一会 stop,一会 start,最后 canal 连的是哪个环境下的 MySQL 我都记不清了。我现在只用 win 下面的 mysql,包括 canal 也是用.bat 启动,没有出现周五的情况。有条件直接上独立 linux,没有条件一定要区分开端口,到目前我认为这个可能性最大。 |