将 MySQL 复制环境安全地置于维护模式的正确方法是什么?

将 MySQL 复制环境安全地置于维护模式的正确方法是什么?

我需要对我们的主/从/从 MySQL 集群进行一些维护。维护涉及优化三个表,其中至少一个表被锁定了大约 2 个小时。每个表的优化操作在主服务器上运行完成,然后在完成后通过二进制日志依次传播到从服务器。

在我看来,我目前有 3 个选择:

  1. 使用 重新启动主机skip-networking,运行优化,然后将其重新联机并允许从属服务器赶上。
  2. 同时使所有 3 个节点离线,并行运行优化操作,然后重置复制。
  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。然后重新联机。

相关内容