MySQL半同步复制不能保障强一致,仅降低主库宕机时的数据丢失概率;插件加载需确认semisync_master.so路径权限及plugin_dir,主从插件不可混用;GTID模式下必须用MASTER_AUTO_POSITION=1;rpl_semi_sync_master_timeout建议设3000–5000毫秒;read_only=1不防SUPER用户写入,须启用super_read_only=1。

MySQL 半同步复制不能保障强一致,它只降低主库宕机时的数据丢失概率;真正需要强一致的场景,得上 Group Replication 或外部仲裁机制。
半同步插件加载失败:找不到 semisync_master.so 或报错
MySQL 5.7+ 默认不自带半同步插件文件,必须确认插件是否存在、路径是否正确、权限是否可读。常见错误是执行 INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' 时提示 “Can't open shared library”。
- 先查插件目录:
SHOW VARIABLES LIKE 'plugin_dir';,典型路径如/usr/lib64/mysql/plugin/或/usr/lib/mysql/plugin/ - 再检查文件是否存在:
ls -l /usr/lib64/mysql/plugin/semisync_*.so;若缺失,需重装mysql-community-server包,或单独下载对应版本的插件(注意平台后缀:Linux 是.so,macOS 是.dylib) - 插件名严格区分主从:
semisync_master.so只能用于主库,semisync_slave.so只能用于从库,混用会导致Plugin init function returned error - 加载失败时 MySQL 错误日志会记录
Plugin 'rpl_semi_sync_master' init function returned error,此时必须先解决路径或依赖问题,再设rpl_semi_sync_master_enabled=1
GTID 模式下 CHANGE MASTER TO 报错 ERROR 1777
启用 gtid_mode=ON 后,不能再用 MASTER_LOG_FILE 和 MASTER_LOG_POS 配置主从,否则会触发 ERROR 1777 (HY000): CHANGE MASTER TO with MASTER_AUTO_POSITION = 0 is not allowed when @@GLOBAL.GTID_MODE = ON。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 必须显式使用
MASTER_AUTO_POSITION = 1,例如:CHANGE MASTER TO MASTER_HOST='192.168.65.131', MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_PORT=3306, MASTER_AUTO_POSITION = 1; - 从库启动前,确保
gtid_executed和gtid_purged已对齐,否则 IO 线程无法拉取日志 - 配置完记得重启 IO 线程:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;,否则半同步不会生效
rpl_semi_sync_master_timeout 设太小导致频繁降级
该参数单位是毫秒,控制主库等待从库 ACK 的最长时间。默认 10000(10 秒),但生产环境设得太小会频繁退化为异步,失去半同步意义;设太大又会让事务卡住太久。
- 建议值:3000–5000(3–5 秒),兼顾网络抖动容忍和响应时效
- 超时后主库自动切回异步,
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';返回OFF,这不是故障,是设计行为 - 恢复后(如从库网络恢复、IO 线程重连成功),会自动重新启用半同步,无需重启 MySQL
- 监控关键指标:
Rpl_semi_sync_master_clients(当前半同步从库数)、Rpl_semi_sync_master_yes_tx(成功半同步事务数),持续为 0 就要排查从库插件或网络
最容易被忽略的是 read_only=1 并不能阻止 SUPER 用户写入,主库误操作风险仍在;真要防写,必须开 super_read_only=1。另外,半同步只保证“至少一个从库收到并落盘 relay log”,不保证 SQL 线程已执行——如果从库 SQL 延迟高,数据仍可能没应用到表里。










