MySQL半同步复制不能保证强一致性,仅降低数据丢失概率;开启后写入延迟上升但远低于全同步;插件加载失败需检查semisync_master.so路径、权限及plugin_dir;主从插件不可混用;rpl_semi_sync_master_timeout过短会导致频繁降级;GTID模式下必须用MASTER_AUTO_POSITION=1;read_only=1不防SUPER用户写入,需super_read_only=1才可靠。

MySQL 半同步复制不能保证强一致性,只能降低数据丢失概率;开启后写入延迟会上升,但比全同步低得多。
半同步插件加载失败:semisync_master.so 找不到或报错
MySQL 5.7+ 默认不自动安装半同步插件,需手动确认插件文件是否存在、路径是否正确、权限是否可读。
-
plugin_dir路径可通过SHOW VARIABLES LIKE 'plugin_dir';查看,常见位置是/usr/lib64/mysql/plugin/或/usr/lib/mysql/plugin/ - 检查插件文件是否存在:
ls -l /usr/lib64/mysql/plugin/semisync_*.so;若缺失,需重装mysql-community-server或单独下载对应版本的插件包 - MySQL 启动时加载失败会在错误日志中报
Plugin 'rpl_semi_sync_master' init function returned error,此时必须先解决插件路径或依赖问题,再设rpl_semi_sync_master_enabled=1 - 插件名区分主从:
semisync_master.so用于主库,semisync_slave.so用于从库,不可混用
rpl_semi_sync_master_timeout 设置过短导致频繁降级为异步
该参数单位是毫秒,控制主库等待从库 ACK 的最长时间。默认 10000(10 秒),生产环境建议设为 3000–5000,太小会频繁触发降级,太大则失去半同步意义。
- 超时后主库自动切回异步模式,
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';会变为OFF - 降级不是故障,是设计行为;恢复后(如从库网络恢复)会自动重新启用半同步,无需重启 MySQL
- 监控关键状态变量:
Rpl_semi_sync_master_clients(当前连接的半同步从库数)、Rpl_semi_sync_master_yes_tx(成功半同步事务数)
GTID 模式下 CHANGE MASTER TO 必须用 MASTER_AUTO_POSITION = 1
启用 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)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 正确写法:
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与主库一致,可通过mysqldump --all-databases --single-transaction --triggers --routines --set-gtid-purged=ON导出并导入来初始化 -
MASTER_AUTO_POSITION = 1依赖主库的Previous_gtid_log_event和从库的gtid_executed自动对齐位点,跳过手动找 binlog 文件和偏移量的步骤
只读从库仍可能被误写入:read_only=1 不等于绝对安全
read_only=1 仅阻止普通用户写入,SUPER 权限用户(如 root)仍可执行 DML/DDL,且该参数不作用于临时表、存储过程内部语句或复制线程自身操作。
- 真正防写入应配合
super_read_only=1(MySQL 5.7.8+),它会拒绝所有 SUPER 用户的写操作(除复制线程外) - 检查是否生效:
SELECT @@read_only, @@super_read_only;,两者都为ON才算可靠 - 注意:设置
super_read_only=1后,无法用SET GLOBAL super_read_only=0关闭,除非先关闭read_only,否则会报错ERROR 1290 (HY000)
半同步真正的复杂点不在配置,而在于它不提供“提交即持久”的承诺——主库返回成功 ≠ 从库已落盘,只是 relay log 写入完成。如果你的应用要求事务在主从两端都 fsync 到磁盘,那得上 Group Replication 或外部仲裁机制,半同步本身做不到。










