我需要对我们的主/从/从 MySQL 集群进行一些维护。维护涉及优化三个表,其中至少一个表被锁定了大约 2 个小时。每个表的优化操作在主服务器上运行完成,然后在完成后通过二进制日志依次传播到从服务器。
在我看来,我目前有 3 个选择:
- 使用 重新启动主机
skip-networking
,运行优化,然后将其重新联机并允许从属服务器赶上。 - 同时使所有 3 个节点离线,并行运行优化操作,然后重置复制。
- 彻底停止节点上的 MySQL,关闭与外界的网络,重新启动它们,在主节点上运行优化,并允许它传播到从节点,然后再恢复网络访问。
我正在努力寻找有关这方面的最佳实践的任何文档,或者关机的具体行为,是否有人能够确认安全地使盒子脱机以执行必要工作的最佳方法?
由于维护将在夜间进行,因此干净地执行操作比所花费的时间更重要。
MySQL 版本是 5.6,不幸的是它是一个较旧的版本,计划在不久的将来升级,但我暂时还是使用它。复制方法是 GTID。
非常感谢。
答案1
首先,你真的需要运行OPTIMIZE TABLE
?在大多数情况下,InnoDB 会保持其表足够干净,从不需要优化。如果您正在使用 MyISAM,则出于各种原因,您应该转换为 InnoDB。
如果优化是因为你做了一个大操作DELETE
,那么 [下次] 以不太干扰的方式执行删除,这可能会消除优化的需要。请参阅http://mysql.rjweb.org/doc.php/deletebig。
好的,回到你的问题。有一个复制设置可以防止命令传播到副本。 https://dev.mysql.com/doc/refman/8.0/en/set-sql-log-bin.html 因此,在主服务器上执行以下操作:
# when logged in with sufficient privileges:
SET sql_log_bin = OFF;
OPTIMIZE TABLE ...;
SET sql_log_bin = ;
然后逐个检查副本:将副本脱机并手动运行OPTIMIZE
。然后重新联机。