能配,但必须手动对齐关键参数:主库需设bind-address=0.0.0.0、开放3306端口;server-id主1从2且不为0;gtid必须启用(gtid_mode=on+enforce_gtid_consistency=on);复制账号须用mysql_native_password插件;从库需显式配置relay-log并使用source_auto_position=1。

能配,但必须手动对齐关键参数,否则从库连不上、同步卡住、甚至主键冲突直接报错。
确认两台 MySQL 8.0 实例已就绪且网络互通
云服务器上 MySQL 默认常监听 127.0.0.1,从库无法连接主库是头号失败原因。必须改配置并开放端口:
- 主库
/etc/my.cnf中确保有bind-address = 0.0.0.0(或明确写主库公网/内网 IP) - 云厂商安全组(如阿里云、腾讯云)必须放行 TCP
3306端口,源地址填从库的 IP(不要用0.0.0.0/0) - 主库执行
SELECT @@bind_address, @@port;验证监听地址不是127.0.0.1 - 从库用
telnet 主库IP 3306或nc -zv 主库IP 3306测试连通性,不通就别往下走
主库和从库的 server-id 和 GTID 必须显式启用
MySQL 8.0 默认不开启 GTID,也不强制校验 server-id;但主从复制一旦启动,server-id 冲突或 GTID 关闭会导致 START REPLICA 报错或复制线程立即退出。
- 主库和从库的
my.cnf都要加:server-id = 1(主库)、server-id = 2(从库),不能相同,也不能为 0 - 都必须启用 GTID:
gtid_mode = ON+enforce_gtid_consistency = ON - 重启后登录 MySQL 执行:
SHOW VARIABLES LIKE 'gtid_mode';和SHOW VARIABLES LIKE 'server_id';,确认值为ON和对应数字 - 若看到
OFF或OFF_PERMISSIVE,说明配置没生效或 mysqld 没重启
创建复制账号时注意认证插件兼容性
MySQL 8.0 默认用 caching_sha2_password,而旧版客户端或部分从库版本可能不支持该插件,导致 CHANGE REPLICATION SOURCE TO 后 SHOW REPLICA STATUS 显示 IO_Running: Connecting 卡死。
- 主库创建账号时必须显式指定插件:
CREATE USER 'repl'@'从库IP' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 不要用
caching_sha2_password,除非你确认从库 MySQL 版本 ≥ 8.0.4 且客户端支持 - 授予权限:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库IP'; FLUSH PRIVILEGES; - 验证:从库机器上用
mysql -h 主库IP -u repl -p能否成功登录,登不进就别试复制
从库执行 CHANGE REPLICATION SOURCE TO 时别漏 relay-log 配置
从库没有显式配置 relay-log,START REPLICA 可能成功,但后续出错时日志路径混乱,排查困难;更严重的是,某些云镜像默认禁用 relay-log,导致 SQL 线程找不到中继日志而静默失败。
- 从库
my.cnf必须加:relay-log = /var/lib/mysql/relay-bin(路径需存在且 mysqld 有写权限) - 执行
CHANGE REPLICATION SOURCE TO时,SOURCE_AUTO_POSITION = 1是必须的(GTID 模式下不支持 file/position 方式) - 典型命令:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP', SOURCE_USER='repl', SOURCE_PASSWORD='xxx', SOURCE_AUTO_POSITION=1; - 启动后立刻查:
SHOW REPLICA STATUS\G,重点看IO_Running和SQL_Running是否为Yes,Seconds_Behind_Master是否在下降
最易被忽略的是:GTID 模式下,主库做了 RESET MASTER 或从库执行过 SET GLOBAL gtid_purged,会导致两端 GTID 集合不匹配,START REPLICA 直接拒绝——这种错误不会报具体提示,只显示 SQL_Running: No,必须查 Last_IO_Error 才知道是 GTID conflict。











