我继承了一个 Mysql master master 系统,我注意到第二个 master(从现在开始我们称它为 slave,因为它在“slave”机器上运行)停止更新它的数据库。我看见了
掌握:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
奴隶:(我截断了一个错误)
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '3' for key 'PRIMARY'' on [...]
考虑到我们无法在那里复制,我不知道是什么导致它处理。重要的是恢复正常运营;
现在我stop slave;
在主服务器和stop slave;
从服务器上,因为我看到如果我更改从服务器上的记录,更改会传播到正在使用中的主服务器。
我如何:在不影响主站数据的情况下强制同步从主站到从站的所有内容?然后希望像往常一样进行从属拾取复制?
更新
OK 我尝试删除从站上的所有表,然后它在该错误部分抱怨“表”不存在。所以我做了一个 Master 的无数据转储,并确保我在 Secondary(slave)中只有空表。我start slave;
在奴隶上,但现在它在抱怨血腥的 alter table 语句,例如:
Last_Errno: 1060
Last_Error: Error 'Duplicate column name [...] Query: 'ALTER TABLE [...]
如何跳过 fracking alter statements 我只想复制该死的数据并完成它,我的表已经有了 FFS 的最新更改,现在它抱怨几周前复制后所做的更改
我如何重置日志或其他东西?
优秀 为什么会开始发生这种情况?“次要”正在传播到“主要”。“主要”不会传播到“次要”。但是我尝试做的任何修复都使它处于相同的状态 Yes-Yes Yes-No 和相同的 Last_Error。我认为大约在那个时候服务器被从网络上取下,这会以某种方式混淆 MySQL 吗?
首先,您需要了解 MySQL 复制仅同步 CHANGES。清空表(或删除它们)不会再次复制数据。您必须使用一组一致的数据文件启动从站。
重新播种您的奴隶的粗略过程如下:(不要遵循这些说明)
如果您不能容忍停机时间,那么有两种方法可以做到这一点。
如果您的数据足够小,您可以 mysqldump 包括数据在内的所有内容,那么这些说明很好。如果您有多个数据库,请务必阅读这篇文章,因为我不会在此处重复这些注意事项。但是如果你只有 1 个数据库,基本步骤是:
mysqldump -u root -e -q --single-transaction --master-data database_name
START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;
如果您的数据库对于 mysql 转储来说太大了,那么您将需要使用操作系统的卷快照功能对您的表进行快照。这将使您的 MySQL 服务器暂停几秒钟,因此最好在下班后完成,因为这可能不会打扰任何人。
flush tables with write lock
. 这将有效地暂停服务器。SHOW MASTER STATUS
获取当前日志位置,然后UNLOCK TABLES
释放锁。服务器现在未暂停。START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;