MySQL 二进制日志复制:可以设置忽略错误吗?
-
09-06-2019 - |
题
我正在运行一个主从 MySQL 二进制日志复制系统(唷!),对于某些数据,该系统不同步(这意味着主服务器比从服务器保存更多的数据)。但是从站经常因为最轻微的 MySQL 错误而停止,这可以禁用吗?(可能是复制从站忽略复制错误或某些类似的 my.cnf 设置;))
这就是时常发生的情况,当从属设备尝试复制不存在的项目时,从属设备就会死亡。快速检查 显示从属状态 \G; 给出
Slave-IO-Running: Yes
Slave-SQL-Running: No
Replicate-Do-DB:
Last-Errno: 1062
Last-Error: Error 'Duplicate entry '15218' for key 1' on query. Default database: 'db'. Query: 'INSERT INTO db.table ( FIELDS ) VALUES ( VALUES )'
我通过执行以下操作立即修复该问题(一旦我意识到从属设备已停止):
STOP SLAVE;
RESET SLAVE;
START SLAVE;
...最近这变得有点令人厌烦,在我吐出某种 PHP 来为我做这件事之前,我想知道是否有一些 my.cnf 条目不会在第一个错误时杀死从属设备。
干杯,
/mp
解决方案
是的,在 my.cnf 中使用 --slave-skip-errors=xxx,其中 xxx 是“全部”或逗号分隔的错误代码列表。
其他提示
停止奴隶;设置全局 sql_slave_skip_counter=1;启动奴隶;
您可以仅忽略当前错误并继续复制过程。
首先,您真的想忽略错误吗?如果出现错误,则数据可能不再同步。也许您想要的是在出现错误时删除从数据库并重新启动同步过程。
其次,我认为您遇到的错误不是当您复制不存在的项目时(这意味着什么?) - 看起来您正在复制从属数据库中已经存在的项目。
我怀疑问题主要是由于没有从干净的数据副本开始而引起的。看起来master已经被复制到了slave;那么复制已被关闭(或失败);然后它又开始了,但没有给奴隶机会追上它错过的事情。
如果您曾经有一段时间可以关闭主服务器以进行写访问足够长的时间以克隆数据库并将其导入从服务器中,那么这可能会解决问题。
现代的 mysqldump
命令有几个选项可以帮助设置一致的复制。查看 --master-data
这会将二进制日志文件和位置放入转储中,并在加载到从属时自动设置。还 --single-transaction
将在事务内执行转储,以便不需要写锁来执行一致转储。
如果从服务器除了复制之外不用于任何写入操作,High Performance MySQL 的作者建议添加 read_only
在从属服务器上,以防止用户错误地更改从属服务器上的数据,因为这也会造成您遇到的相同错误。
我认为您正在进行复制而不同步数据库,首先同步数据库并尝试复制,服务器正在生成相同的唯一ID并尝试设置自动增量偏移