MySQL二进制日志复制:是否可以将其设置为忽略错误?

时间:2020-03-05 18:43:58  来源:igfitidea点击:

我正在运行一个主从MySQL二进制日志复制系统(phew!),对于某些数据,该系统不同步(这意味着主数据库比从数据库拥有更多的数据)。但是奴隶在丝毫MySQL错误中非常频繁地停止,可以禁用它吗? (也许是my.cnf设置,用于复制从属的ignore-replicating-errors或者某种类似的东西;))

这就是发生的情况,时不时地,当从属设备尝试复制不存在的项目时,从属设备就会死亡。快速查看SHOW SLAVE STATUS \ 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

解决方案

回答

首先,我们真的要忽略错误吗?如果出现错误,则数据可能不再同步。也许我们想要的是删除从属数据库并在出现错误时重新启动同步过程。

其次,我认为当复制一个不存在的项目时(不是什么意思?),我们得到的错误不是,似乎我们正在复制从数据库中已经存在的项目。

我怀疑该问题主要是由于没有从干净的数据副本开始而引起的。似乎主服务器已被复制到从属服务器;然后复制已关闭(或者失败);然后它又重新启动了,但是没有给奴隶一个追赶它错过的机会的机会。

如果我们曾经有一段时间可以关闭主服务器以进行写访问,以克隆数据库并将其导入到从服务器中,那么这可能会解决问题。

回答

现代的" mysqldump"命令有几个选项可帮助设置一致的复制。检出--master-data,它将二进制日志文件和位置放入转储中,并在加载到slave时自动设置。同样,"-single-transaction"将在事务内进行转储,因此不需要写锁即可进行一致的转储。

回答

是的,在my.cnf中使用--slave-skip-errors = xxx,其中xxx是'all'或者错误代码的逗号分隔列表。

回答

如果从属服务器不用于复制以外的任何写操作,高性能MySQL的作者建议在从属服务器上添加" read_only",以防止用户错误地更改从属服务器上的数据,因为这也会产生与我们相同的错误有经验的。

回答

我认为我们正在执行不同步数据库的复制,请先同步数据库,然后尝试复制,服务器将生成相同的唯一ID,并尝试设置自动缩进偏移量

回答

停止奴隶;设置全局sql_slave_skip_counter = 1;启动奴隶;

我们可以仅忽略当前错误,然后继续复制过程。