mysql 8.0+主从复制中,创建同步账号必须显式指定mysql_native_password插件、限定从库真实ip、仅授予replication slave权限,并执行flush privileges;同时需确保主库网络监听、防火墙及selinux放行3306端口。

CREATE USER 语句必须指定认证插件(尤其 MySQL 8.0+)
MySQL 8.0 默认使用 caching_sha2_password 插件,但从库连接主库时若用这个插件,常报 Authentication plugin 'caching_sha2_password' cannot be loaded 或握手失败。这不是权限问题,是认证不兼容。
- 显式指定
mysql_native_password:执行CREATE USER 'repl'@'192.168.146.176' IDENTIFIED WITH mysql_native_password BY '123456'; - 不要省略
IDENTIFIED WITH—— 即使密码正确,没指定插件也会沿用默认,导致从库连不上 - 生产环境禁止用
'repl'@'%',必须限定从库真实 IP,比如'repl'@'10.0.2.15'
GRANT 必须只给 REPLICATION SLAVE 权限
复制账号不是登录账号,也不参与业务操作。给多了权限(比如 SELECT、ALL PRIVILEGES)既无用又增加风险,还可能在某些审计策略下被拦截。
- 只执行
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.146.176'; -
ON *.*是必需的——该权限作用域不能限定到某个库或表,MySQL 复制机制要求全局范围 - 执行完必须跟
FLUSH PRIVILEGES;,否则从库连上去会提示Access denied; you need (at least one of) the SUPER or REPLICATION SLAVE privilege(s)
账号密码明文存储在 CHANGE MASTER TO 中
从库执行 CHANGE MASTER TO 时,MASTER_USER 和 MASTER_PASSWORD 会以明文形式写入 mysql.slave_master_info 表(或磁盘文件),这是 MySQL 内部机制决定的,无法加密。
- 这意味着:如果有人能查从库的系统表或备份文件,就能拿到主库复制账号密码
- 所以账号密码强度要高,且**不能复用其他业务账号密码**
- 若合规要求严格,可考虑用 MySQL 8.0+ 的
START SLAVE USER='repl' PASSWORD='123456';方式(密码不落盘),但需主从都为 8.0.22+ 且开启master_info_repository=TABLE
防火墙和 SELinux 常被忽略但直接拦住连接
账号创建、授权、插件都对了,CHANGE MASTER TO 却报 Can't connect to MySQL server on 'xxx' (111),八成是网络层卡住了。
- 检查主库是否监听
0.0.0.0:3306(而非仅127.0.0.1:3306):运行netstat -tlnp | grep :3306 - 确认主库防火墙放行:CentOS 7+ 执行
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload - SELinux 若启用,需额外放开:执行
setsebool -P mysqld_connect_any 1,否则从库连过去会被拒绝
实际配置中,最易出问题的不是 SQL 写错,而是认证插件 + 网络策略这两环没对齐。只要这两处确认无误,SHOW MASTER STATUS 和 START SLAVE 就大概率能跑通。











