我是MySQL的新手,经过长时间的搜索,我能够配置基于主从ROW的复制。我认为这样做是安全的,我不必一次又一次地重新检查。
但今天当我在奴隶身上做SHOW SLAVE STATUS;
时,我发现了
无法执行Write_rows事件 table mydatabasename.atable;重复 关键'PRIMARY'的条目'174465', Error_code:1062;处理程序错误 HA_ERR_FOUND_DUPP_KEY;事件 主日志mysql-bin.000004, end_log_pos 60121977
当有人没有这样的错误并且两台服务器上的架构相同时,有人能告诉我这是怎么发生的,那怎么可能发生这种情况呢?以及如何修复它以使其再次工作以及如何在将来防止此类事件。
除了这个之外,还请让我知道除了这个之外还有什么意想不到的。
答案 0 :(得分:6)
它永远不会发生在主人身上,为什么?
从master中复制了一系列SQL,
如果记录已存在于master中,则mysql拒绝在master
但是在slave上,如果失败并且复制位置没有进入下一个SQL(它刚停止)
<强>原因吗
该记录的插入查询直接写入从服务器,而不使用主服务器的复制
如何解决?
跳过奴隶上的错误,例如
SET GLOBAL sql_slave_skip_counter = N;
详情 - http://dev.mysql.com/doc/refman/5.0/en/set-global-sql-slave-skip-counter.html
或删除slave上的重复记录,再次恢复从属设备(让复制执行插入)
更糟糕的情况是,您需要重新进行设置以确保从站的数据完整性。
如何预防?
检查应用程序级别,确保不直接写入从站
这包括如何在命令提示符
拆分可以进行写入和读取的mysql用户,
因此,当不需要写入时,您的应用程序应使用读取用户(主服务器和从服务器)
使用write user(仅限master)执行操作需要写入数据库。
答案 1 :(得分:2)
跳过计数器始终不是一个可行的解决方案,您正在跳过记录,但它可能会影响其他记录。
以下是关于sql slave skip counter为什么不好的完整细节。
答案 2 :(得分:0)
您可以删除从数据库中大于重复行的内容;
DELETE FROM mydatabasename.atable WHERE ID>=174465;
然后
START SLAVE;