DB1 和 DB2。
我对 DB1 做了一些更改,但 DB2 上似乎没有。当我在 DB2 上执行“SHOW SLAVE STATUS\G”时,似乎出现了错误:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host:
Master_User:
Master_Port:
Connect_Retry: 60
Master_Log_File: mysql-bin.0005496
Read_Master_Log_Pos: 5445649315
Relay_Log_File: mysqld-relay-bin.0041705
Relay_Log_Pos: 1624302119
Relay_Master_Log_File: mysql-bin.0004461
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '4779' for key 1' on query. Default database: 'falc'. Query: 'INSERT INTO `log` (`anon_id`, `created_at`, `query`, `episode_url`, `detail_id`, `ip`) VALUES ('fdzn1d45kMavF4qbyePv', '2009-11-19 04:19:13', 'amazon', '', '', '130.126.40.57')'
Skip_Counter: 0
Exec_Master_Log_Pos: 162301982
Relay_Log_Space: 136505187184
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
然后我就这么做了显示表格,而且 DB2 似乎缺少我在 DB1 上创建的表……这意味着由于某种原因,DB2 停止与 DB1 同步。
我怎样才能简单地让它们再次完全同步?
我想要的只是 DB2 与 DB1 完全相同!
答案1
通过在两台服务器上设置 auto_increment_increment 和 auto_increment_offset 值可以避免主键冲突。
在两台服务器上将 auto_increment_increment 设置为相同的值(例如,4) 在两台服务器上将 auto_increment_offset 设置为不同的值(例如,服务器 A 上为 1,服务器 B 上为 2)。
这将有助于避免将来自动增量主键发生冲突。两个 mysql 服务器都需要重新启动才能使此方案生效,理想情况下,当您重新启动它们时,它们应该同步。
您的系统管理员可能已经完成所有这些操作,但它看起来像是 auto_increment 键冲突。
至于您当前的困境,请检查log
两台服务器上表中 ID 为 4779 的行。如果行完全相同,则可以安全地运行 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE; 以再次运行复制。
如果它们不同,您将需要决定保留哪一个。
请记住,您为解决此问题而发出的任何 SQL 插入/更新/删除语句最终都将在两台服务器上运行,因此请仔细考虑。
您可以使用 SQL_LOG_BIN=0; 指令仅在一个框上运行一条语句来修复复制错误。
祝你好运!
答案2
MySQL 复制是 A->B 而不是 A<->B,因此请确保您正在更新主数据库 (A),它是向下复制到从属数据库 (B) 的数据库。如果没有,那么这可能是您的问题。
答案3
我猜想是某个地方的表设置不正确。复制停止,因为复制查询失败:
查询中键 1 的条目“4779”重复
您可以将跳过查询计数设置为 1,然后继续处理,这样复制器将跳过错误语句并继续复制。然后您的表将(可能)在复制恢复后不久出现。但是,您必须问自己,“为什么这个复制查询失败了?”。然后您必须问自己,“你觉得自己很幸运吗?”小子。嗯,是吗?