MySQL 8.0主从复制本身不提供高可用,必须结合自动切换机制(如MHA、Keepalived或MGR)才能实现故障时业务不中断;仅配置主从属手动容灾,非真正高可用。

MySQL 8.0 主从复制本身不等于高可用,它只是高可用的基础组件。真正实现“故障时业务不中断”,必须配合自动切换机制(如 MHA、Keepalived 或 MySQL Group Replication)。只配主从,主库一挂,你得手动改应用连接地址——这不是高可用,是手动容灾。
确认 GTID 已启用且 binlog_format = ROW
MySQL 8.0 默认开启 gtid_mode = ON 和 enforce_gtid_consistency = ON,但生产环境仍需验证,不能依赖“默认”。
-
连上主库执行:
SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'binlog_format';
若
binlog_format是STATEMENT或MIXED,必须改回ROW:binlog_format = ROW是数据一致性的底线,否则像NOW()、UUID()等非确定性函数会导致主从不一致。修改
/etc/my.cnf的[mysqld]段后,必须重启mysqld才生效;仅SET GLOBAL不持久,重启即丢。
创建复制账号时注意 plugin 兼容性
MySQL 8.0 默认用 caching_sha2_password,但很多中间件(如旧版 MyCat 1.6、部分监控工具、甚至某些 JDBC 驱动)不认它。
-
创建账号时显式指定认证方式更稳妥:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ReplPass123!';
-
授权后立即验证插件类型:
SELECT user, host, plugin FROM mysql.user WHERE user = 'repl';
-
如果看到
caching_sha2_password,而下游组件连不上,别折腾驱动,直接改:ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ReplPass123!';
从库启动复制前必须校验 GTID 一致性
用 GTID 搭建从库时,CHANGE REPLICATION SOURCE TO(MySQL 8.0.23+ 新语法)不接受 MASTER_LOG_FILE/MASTER_LOG_POS,只认 SOURCE_AUTO_POSITION = 1。
-
启动复制前务必确认:
- 主库
SHOW MASTER STATUS中的Executed_Gtid_Set非空 - 从库
SELECT @@GLOBAL.gtid_executed;返回值为空(全新从库)或与主库兼容(已有数据需RESET SLAVE ALL后再导入)
- 主库
-
常见错误现象:
ERROR 3021 (HY000): This operation cannot be performed with a running slave io_thread
出现这个,不是配置错,是忘了先停复制线程:STOP REPLICA;
-
正确启动命令示例:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.100', SOURCE_USER='repl', SOURCE_PASSWORD='ReplPass123!', SOURCE_AUTO_POSITION = 1;
START REPLICA;
复制延迟和数据一致性不能只看 Seconds_Behind_Master
这个值为 0 只代表 SQL 线程追上了中继日志,不代表数据已真正一致。
-
更可靠的检查方式:
- 主库写一行带时间戳的测试记录,比如:
INSERT INTO test_heartbeat(ts) VALUES (NOW(6));
- 立即在从库查该行的
ts值,对比是否偏差超过可容忍范围(如 > 500ms)
- 主库写一行带时间戳的测试记录,比如:
-
半同步复制必须显式启用,否则仍是异步:
- 主库装插件:
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
- 从库装插件:
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
- 开关参数:
rpl_semi_sync_source_enabled = ON、rpl_semi_sync_replica_enabled = ON
- 主库装插件:
注意:半同步不保证“永远不丢数据”,只保证“至少一个从库落盘”。如果那个从库也同时宕机,照样丢。
真正的高可用不在复制本身,而在故障检测、选主逻辑、数据补齐、服务重定向这一整套闭环。主从配得再稳,没自动切换,就只是多存了一份冷备份。

















