为什么 MySQL Galera 不复制用户表?

为什么 MySQL Galera 不复制用户表?

我正在运行一个 3 节点 MySQL 5.6 Galera 集群。一切都同步并且看起来不错,但我刚刚发现用户表不同步。

一个特定的用户不存在于其他节点上,我认为在发出以下命令后它可能会复制它:

mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('10.0.0.10','haproxy_check'); FLUSH PRIVILEGES;"

我仔细检查了所有节点上的 wsrep 状态和用户表。在其他 2 个节点上发出命令后,它可用,并且 galera 似乎仍处于同步状态。

我这里漏掉了什么吗?为什么 galera 不复制用户表?

答案1

它位于已知的限制

目前复制仅适用于数据库引擎InnoDB存储引擎。对其他类型的表的任何写入,包括系统(mysql.*)表不会被复制(此限制不包括 DDL 语句,例如 CREATE USER,这些语句会隐式修改 mysql.* 表 — 这些表会被复制)。不过,目前有对 MyISAM 的实验性支持 — 请参阅wsrep_replicate_myisam系统变量)

因此,使用正确的CREATE USER语句将会复制,而您的 INSERT INTO mysql.user语句则不会。

GRANT如果语句被视为 DDL 语句并且是否会复制, 我找不到合适的参考。

答案2

如上所述,MyISAM 不会被复制。GRANT 和 CREATE USER 以及所有其他操作系统表的命令都会被复制。始终使用它们,您就不会因为 galera 而遇到麻烦,也不会在底层实现发生变化时陷入困境。

您可能需要使用 Percona Toolkit 中的 pt-show-grants 从一个节点提取您的授权并将其注入回集群。

相关内容