12

我正在运行一个主从 MySQL 二进制日志复制系统(唷!),对于某些数据,它不同步(意思是,主服务器比从服务器拥有更多的数据)。但是slave会因为最轻微的MySQL错误而频繁停止,这可以禁用吗?(也许是复制从属忽略复制错误或某些类型的 my.cnf 设置;))

这就是不时发生的情况,当从站尝试复制不存在的项目时,从站就会死掉。在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

4

6 回答 6

15

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

您可以只忽略当前错误并继续复制过程。

于 2009-07-29T15:30:36.450 回答
12

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

于 2008-08-27T18:58:09.937 回答
3

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

其次,我认为你得到的错误不是当你复制一个不存在的项目时(这意味着什么?) - 看起来你正在复制一个已经存在于从数据库中的项目。

我怀疑问题主要出在没有从干净的数据副本开始。好像master已经复制到slave上了;然后复制已关闭(或失败);然后它又重新启动了,但没有给奴隶机会赶上它错过的东西。

如果您曾经有一段时间可以关闭主服务器以进行写访问足够长的时间来克隆数据库并将其导入从服务器,这可能会让问题消失。

于 2008-08-27T17:41:40.837 回答
2

现代mysqldump命令有几个选项可以帮助设置一致的复制。检查--master-data哪个会将二进制日志文件和位置放在转储中,并在加载到从站时自动设置。还将在--single-transaction事务中进行转储,这样就不需要写锁来进行一致的转储。

于 2008-08-27T17:48:59.043 回答
1

如果从服务器不用于复制以外的任何写入,高性能 MySQL 的作者建议read_only在从服务器上添加以防止用户错误地更改从服务器上的数据,因为这也会产生您遇到的相同错误。

于 2008-09-13T17:44:42.530 回答
0

我认为您正在进行复制而不同步数据库首先同步数据库并尝试复制,服务器正在生成相同的唯一 ID 并尝试设置自动增量偏移量

于 2009-07-29T10:14:16.403 回答