我正在运行一个 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 从一个节点提取您的授权并将其注入回集群。