原生主从复制从mysql 5.7到8.0大概率静默失败,因认证插件(caching_sha2_password不兼容)、系统表结构(mysql.user字段变更)和gtid机制差异三类硬伤,必须手动配置default_authentication_plugin、禁用gtid、统一sql_mode并清理非innodb系统表才能启动。

原生主从复制从 MySQL 5.7 到 8.0 不是“配完就能跑”,而是大概率静默失败——Seconds_Behind_Master 为 NULL、IO_THREAD 反复重连、SQL_THREAD 卡在 mysql.user 表,都是典型症状。必须手动对齐认证、系统表、GTID 三处硬伤,否则同步根本起不来。
为什么 START SLAVE 后 Seconds_Behind_Master 是 NULL
这不是延迟高,是 IO_THREAD 根本没连上主库。99% 情况下是认证插件不匹配:caching_sha2_password 在 8.0 从库默认启用,但 5.7 主库 binlog event 里不带该插件握手信息,导致从库反复报错 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 必须在 5.7 主库
my.cnf的[mysqld]段加default_authentication_plugin=mysql_native_password,然后重启服务——否则新建用户仍用caching_sha2_password,后续权限变更事件无法同步 - 8.0 从库连接主库时,显式指定用户用
mysql_native_password插件:执行CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 检查主库当前用户插件:运行
SELECT user, host, plugin FROM mysql.user;,确保所有复制账户的plugin字段值为mysql_native_password
导入初始快照时为什么不能用 --set-gtid-purged=ON
5.7 和 8.0 的 GTID 实现机制不同,直接启用会触发 GTID_PURGED 冲突,导致 START SLAVE 报错 The server is not configured properly to become a slave,甚至卡死。
- 导出必须加
--set-gtid-purged=OFF:mysqldump --all-databases --routines --triggers --single-transaction --set-gtid-purged=OFF > init.sql - 8.0 从库导入后,立刻执行
RESET MASTER;——清空自身 GTID 集合,避免与主库冲突 - 配置复制时,
CHANGE MASTER TO必须指定MASTER_AUTO_POSITION = 0(即禁用 GTID 复制),改用MASTER_LOG_FILE和MASTER_LOG_POS
从库报 Could not execute Write_rows_v1 event on table mysql.user 怎么办
这是 5.7 的 mysql.user 表结构(含 password 字段)被 8.0 拒绝写入的明确信号。8.0 已将字段改为 authentication_string,且强制引擎为 InnoDB,而 5.7 的 binlog 事件仍按旧结构发过来。
- 立即执行
STOP SLAVE; - 删掉从库
mysql库下所有非 InnoDB 表:DROP TABLE IF EXISTS plugin, servers, time_zone_leap_second, time_zone_name, time_zone_transition, time_zone_transition_type; - 确认
mysql.user表引擎为InnoDB:SHOW CREATE TABLE mysql.user;,如果不是,不要手动改,而是重装 8.0 初始化的mysql系统库 - 再执行
START SLAVE;,并紧盯SHOW SLAVE STATUS\G中的Slave_SQL_Running_State是否进入Waiting for master to send event
sql_mode 不一致会导致 DDL 直接被跳过
8.0 默认开启 ONLY_FULL_GROUP_BY,而 5.7 主库发来的某些 ALTER TABLE 或视图创建语句,在 8.0 从库上因 sql_mode 严格校验失败,会被 SQL 线程静默跳过,造成结构不一致。
- 8.0 从库
my.cnf中显式设置:sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION - 务必删掉
ONLY_FULL_GROUP_BY和已移除的NO_AUTO_CREATE_USER——后者在 8.0 解析时会直接报错退出 - 验证是否生效:
SELECT @@sql_mode;,输出中不应出现上述两个被移除项
最易被忽略的是:即使所有配置都对了,SHOW SLAVE STATUS 显示 Yes/Yes,也得翻 8.0 从库错误日志找 Could not execute 类报错——这类问题不会中断复制,但会让表结构或数据悄悄偏离,直到某次业务查询暴雷。











