标题有点令人困惑,但我想不出更好的标题。
我有一个简单的 MySQL 复制,从属偶尔会出现故障,并出现此错误:(Error 'Can't find record in 'my_tbl'' on query. Default database: 'my_db'. Query: 'UPDATE my_tbl SET ... WHERE ...'
为清楚起见省略了列)。
我假设这个错误意味着从属 SQL 线程执行了此更新并收到了。这与与中继日志0 rows affected
的结果进行比较时所期望的不符,因此产生了错误。1 rows affected
手动运行相同的更新事务时,它可以正常工作。运行时也是一样START SLAVE
- 它刚开始工作,然后恢复正常。
这对我来说完全没有意义 - 如果只需要“重试”即可修复此问题,那么这怎么可能发生呢?一切都以序列化方式执行,没有其他任何内容写入从属 mysql 服务器。
有人可以解释一下吗?
一些技术细节 - 这是从 5.5.7-rc 到 5.5.12 的混合复制设置。
答案1
有一个文件MySQL 错误 #60091关于可能满足您的条件的 InnoDB 表的复制 - 请查看它,检查您的版本是否受到影响并最终更新它以检查它是否有帮助。
对此的另一种解释是无序执行 - 当运行 时UPDATE my_tbl SET ... WHERE ...
,任何行都无法满足 WHERE 条件,因为它还有待发生。不过我想不出原因 - 这应该是在 MySQL 邮件列表中询问的问题。
答案2
我发现了这个问题背后的原因 - 一个事件在主服务器上和从服务器上同时运行。解决方案很简单 -alter event event_name disable on slave;
使用 创建从服务器时要记住的一点mysqldump
。