我继承了 Mysql master 系统,我注意到第二个主服务器(从现在开始我们称其为从服务器,因为它在“从属”机器上运行)停止更新其数据库。我看到
掌握:
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;
从服务器上,因为我发现如果我在从服务器上更改记录,这些更改会传播到正在使用的主服务器上。
我该如何:强制将所有内容从主服务器同步到从服务器而不影响主服务器的数据?然后希望从服务器像往常一样进行拾取复制?
更新
好的,我尝试删除从服务器上的所有表,然后它在错误部分抱怨“表”不存在。因此,我对主服务器进行了无数据转储,并确保辅助服务器(从服务器)中只有空表。我start slave;
在从服务器上,但现在它抱怨该死的 alter table 语句,例如:
Last_Errno: 1060
Last_Error: Error 'Duplicate column name [...] Query: 'ALTER TABLE [...]
如何跳过水力压裂修改语句我只想复制该死的数据并完成它,我的表已经有最新的更改 FFS,现在它抱怨几周前复制被抓住后所做的更改
我该如何重置日志或者其他操作?
杰出的 为什么会发生这种情况?“辅助”正在传播到“主”。“主”没有传播到“辅助”。但我尝试进行的任何修复都使其处于相同的状态是-是是-否,并且 Last_Error 相同。我认为在那个时候服务器已脱离网络,这会不会在某种程度上混淆 MySQL?
答案1
首先,您需要了解 MySQL 复制仅同步更改。清空表(或删除表)不会再次复制数据。您必须使用一组一致的数据文件启动从属服务器。
重新播种你的从属服务器的粗略过程如下:(不要遵循这些说明)
- 获取数据的一致快照。
- 将快照复制到从属服务器。
- 重新配置并启动从属。
如果您不能容忍停机时间,那么有两种方法可以实现这一点。
如果你的数据足够小,你可以 mysqldump 所有内容,包括数据,那么这些说明很好。如果您有多个数据库,请务必阅读本文,因为我不会在这里重复这些注意事项。但如果您只有 1 个数据库,则基本步骤如下:
- 在主服务器上,像这样备份数据库:
mysqldump -u root -e -q --single-transaction --master-data database_name
- 将此备份导入到您的从属设备。
- 查看备份文件的开头以获取主日志名称和位置。
- 在 mysql shell 中的从属服务器上,运行类似这样的操作,但使用步骤#3 中的信息进行更新:
START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;
- 在主服务器上,像这样备份数据库:
如果您的数据库对于 mysql dump 来说太大,那么您将需要使用操作系统的卷快照功能对表进行快照。这将暂停您的 MySQL 服务器几秒钟,因此最好在下班后进行,因为这样可能不会打扰任何人。
- 在 mysql shell 中的主服务器上,对所有表进行写锁定,以使它们保持一致
flush tables with write lock
。这将有效地暂停服务器。 - 不要退出 mysql shell,否则您将失去锁。
- 在另一个 OS shell 中,对 mysql 数据卷进行快照。
- 返回 mysql shell:
SHOW MASTER STATUS
获取当前日志位置,然后UNLOCK TABLES
释放锁。服务器现在已取消暂停。 - 访问快照并将mysql数据文件复制到从属服务器。
- 在 mysql shell 中的从属服务器上,运行类似这样的操作,但使用步骤#4 中的信息进行更新:
START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;
- 在 mysql shell 中的主服务器上,对所有表进行写锁定,以使它们保持一致