重置MariaDB 10.1.20集群节点root密码后,开启wsrep重启服务报错且无法添加新节点
解决MariaDB集群重置密码后节点同步失败的问题
咱们先理清楚问题根源:你在第二个节点关闭wsrep脱离集群后修改了root密码,这个操作只修改了该节点本地的mysql.user权限表,并没有同步到集群其他节点。当你重新开启wsrep后,这个节点尝试重新加入集群时,会因为权限表数据和集群其他节点不一致触发冲突,导致服务报错,同时整个集群的数据一致性被破坏,自然也无法添加新节点。
下面是具体的修复步骤:
第一步:停止出问题的第二个节点服务
先把这个节点的MariaDB停掉,避免它继续和集群产生冲突:
systemctl stop mariadb.service
第二步:重新同步节点数据(两种方法选其一)
方法1:通过SST(状态快照传输)自动同步
这是最常用的方法,节点会自动从集群拉取全量数据,覆盖本地不一致的内容:
- 打开第二个节点的
/etc/my.cnf.d/server.cnf,确保wsrep相关配置正确(重点是wsrep_cluster_address要指向集群中正常运行的节点,比如gcomm://node1_ip,node3_ip,node4_ip,node5_ip),并且保持wsrep = ON。 - 确认SST配置:如果之前没配置过SST账号,先在集群任意正常节点(比如节点1)登录MariaDB创建SST专用账号:
CREATE USER 'sst_user'@'%' IDENTIFIED BY 'your_secure_sst_password'; GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sst_user'@'%'; FLUSH PRIVILEGES;
然后在第二个节点的server.cnf中添加或修改SST配置:
wsrep_sst_method = rsync wsrep_sst_auth = "sst_user:your_secure_sst_password"
- 启动第二个节点的MariaDB服务:
systemctl start mariadb.service
启动后,节点会自动触发SST同步,从集群拉取全量数据(包括正确的权限表),完成后节点就会和集群保持一致,报错会消失。
方法2:手动重置节点数据(适合大集群减少同步时间)
如果你的集群数据量很大,不想做全量同步,可以手动清空本地数据后重新加入集群:
- 彻底删除第二个节点的MariaDB数据目录(注意:如果该节点有未同步的业务数据,请先备份!):
rm -rf /var/lib/mysql/* # 路径根据你的实际部署调整,可能是/var/lib/mariadb/
- 确保
server.cnf中wsrep配置正确,wsrep = ON,wsrep_cluster_address指向集群正常节点。 - 启动MariaDB服务,节点会自动加入集群并同步全量数据。
第三步:验证集群状态并添加新节点
等第二个节点同步完成后,登录任意集群节点执行以下命令确认集群状态:
SHOW STATUS LIKE 'wsrep_cluster_size';
返回的数值应该是5,说明所有节点都已正常加入。此时再尝试添加新节点,应该可以正常完成同步。
后续重置密码的正确姿势
以后再需要重置root密码,不要脱离集群操作,正确步骤是:
- 在任意正常节点停止MariaDB服务,启动时跳过权限验证:
systemctl stop mariadb.service mysqld_safe --skip-grant-tables &
- 登录MariaDB修改root密码:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('your_new_root_password'); FLUSH PRIVILEGES;
- 停止
mysqld_safe,正常启动MariaDB服务:
mysqladmin shutdown systemctl start mariadb.service
这样修改的密码会通过wsrep自动同步到所有集群节点,不会出现数据不一致的问题。
内容的提问来源于stack exchange,提问作者user3637971
相关产品推荐
相关产品推荐

