我有这样的配置:
- Master 运行 MySQL 5.5,日志文件格式为:STATEMENT
- 运行 MySQL 8.0 的从服务器 - 已连接到 (1) 主服务器。日志文件格式:ROW
- 另一个运行 MySQL 8.0 的从服务器 - 连接到 (2) 第一个从服务器。日志格式:ROW
主要问题:从属服务器 3(连接到从属服务器 2,而从属服务器 2 连接到主服务器)有时查询不同步。我收到类似“无法执行查询。重复 ID‘12345’已存在”的错误。然后我需要从从属服务器(2)再次转储数据库,并在正确位置再次启动从属服务器(3)。它保持同步一两天,然后我再次收到错误。
次要问题:尝试修复主要问题,我尝试将从机(2)(也是从机(3)的主控)日志格式更改为 STATEMENT,但它完全停止同步(之前运行良好)。没有错误。只是 second_behind_master 不断上升,而不是推进中继日志。当我将日志格式改回 ROW 时,它恢复同步,没有任何问题。
我也尝试将从属(3)日志格式更改为 STATEMENT,但是随后我收到主服务器发送 ROW 格式的错误(尽管我将其更改为 STATEMENT - 参见上文)并且从属服务器采用 STATEMENT 格式。
有什么想法吗?谢谢。
答案1
日志格式是在主服务器上设置的,而不是从服务器上。因此,将其设置为ROW
1。您还需要在 2 上设置 log_slave_updates。
确保 2 和 3 配置为
read_only=1
听起来好像有什么东西在主服务器的下游注入了一个操作,并且将主服务器之外的所有内容设置为 read_only 应该可以阻止这种情况发生。
确保没有任何东西使用具有 SUPER 权限的帐户,通常只有您的 root@localhost 才应该具有 SUPER 权限,并且您的应用程序不应该以 foot 身份连接。SUPER 权限忽略 read_only。