必须先在主库用alter user修改复制账号密码并flush privileges,再在从库执行change master to仅更新master_password;顺序颠倒或跳步会导致slave_io_running卡在connecting并报error 1045。

必须先改主库复制账号密码,再在从库用 CHANGE MASTER TO 更新密码,否则复制立即中断。跳过任一环节或顺序颠倒,Slave_IO_Running 会卡在 Connecting 状态,错误日志里反复出现认证失败(ERROR 1045 或 Access denied)。
确认当前复制账号和权限
别凭记忆操作,直接查主库实际配置:
- 登录主库执行:
SELECT User, Host FROM mysql.user WHERE Repl_slave_priv = 'Y';,确认复制账号名和允许连接的Host(如'repl'@'192.168.2.%') - 检查该账号是否真有
REPLICATION SLAVE权限:SHOW GRANTS FOR 'repl'@'192.168.2.%'; - 若账号不存在或权限不全,需先创建并授权:
CREATE USER 'repl'@'192.168.2.%' IDENTIFIED BY 'old_pass'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.2.%'; FLUSH PRIVILEGES;
主库改密码:用 ALTER USER,不是 SET PASSWORD
SET PASSWORD 在 MySQL 8.0+ 已弃用,且对复制账号可能不生效;ALTER USER 才能确保密码哈希被正确写入 mysql.user 表并兼容认证插件。
- 执行:
ALTER USER 'repl'@'192.168.2.%' IDENTIFIED BY 'new_strong_password'; - 立刻执行:
FLUSH PRIVILEGES;(MySQL 8.0+ 虽然多数情况自动刷新,但此处显式调用更稳妥) - 验证新密码能否连通(可选但推荐):
mysql -u repl -h 主库IP -p,输入新密码测试
从库更新连接配置:只改密码,不动位点
从库仍在用旧密码尝试连接主库,SHOW SLAVE STATUS\G 中 Slave_IO_Running 会是 No,Last_IO_Error 明确提示密码错误。此时不能 RESET SLAVE,否则丢失当前同步位置。
- 先停复制:
STOP SLAVE; - 仅更新密码参数,其他(
MASTER_LOG_FILE、MASTER_LOG_POS、MASTER_HOST等)保持原值不变:CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='new_strong_password'; - 重启复制:
START SLAVE; - 检查状态:
SHOW SLAVE STATUS\G,确认Slave_IO_Running和Slave_SQL_Running均为Yes,且Seconds_Behind_Master开始下降
容易忽略的关键细节
密码改完不代表万事大吉。两个地方常被跳过,导致后续出问题:
-
MASTER_PASSWORD在CHANGE MASTER TO中是明文传入的,MySQL 会自动加密存储到mysql.slave_master_info表中——但如果你启用了master_info_repository = TABLE(推荐),这个表本身要可写;若设为FILE,则需确保master.info文件所在目录 MySQL 进程有写权限 - 如果主库开启了密码策略(如
validate_password插件),新密码必须满足强度要求,否则ALTER USER报错ERROR 1819;临时禁用策略命令是:SET GLOBAL validate_password.policy = LOW;,改完再恢复











