2026年03月27日-MySQL主从复制配置 MySQL主从复制架构实战指南 MySQL主从复制是实现数据备份、读写分离和高可用性的基础架构。合理配置主从复制,能够提升系统性能和数据安全性。 复制原理概述 MySQL主从复制基于二进制日志(binlog)实现: 主库:将数据变更记录到binlog 从库:IO线程读取主库binlog并写入中继日志(relay log) 从库:SQL线程读取relay log并重放数据变更 复制模式: 异步复制:主库不等待从库确认,性能高但可能丢数据 半同步复制:主库等待至少一个从库确认,平衡性能和安全 组复制(MGR):多主架构,自动故障转移,高可用方案 主库配置 修改my.
MySQL主从复制是实现数据备份、读写分离和高可用性的基础架构。合理配置主从复制,能够提升系统性能和数据安全性。
MySQL主从复制基于二进制日志(binlog)实现:
复制模式:
修改my.cnf:
[mysqld] # 服务器ID,唯一标识 server-id=1 # 启用二进制日志 log-bin=mysql-bin binlog_format=ROW # 需要复制的数据库(可选) binlog-do-db=app_db binlog-ignore-db=mysql,information_schema # GTID模式(推荐) gtid-mode=ON enforce-gtid-consistency=ON
创建复制用户:
-- 创建复制用户 CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongPassword123!'; -- 授予复制权限 GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; -- 刷新权限 FLUSH PRIVILEGES;
获取主库状态:
-- 查看master状态 SHOW MASTER STATUS; -- 如果使用GTID,查看已执行的GTID SHOW MASTER GTID_EXECUTED;
锁表备份(初始同步):
-- 锁定所有表 FLUSH TABLES WITH READ LOCK; -- 查看binlog位置 SHOW MASTER STATUS; -- 备份数据 mysqldump -u root -p --all-databases --master-data=2 > backup.sql -- 解锁 UNLOCK TABLES;
修改my.cnf:
[mysqld] # 服务器ID,必须唯一 server-id=2 # 中继日志 relay-log=mysql-relay-bin # 只读模式(可选,防止从库写入) read-only=1 # GTID模式 gtid-mode=ON enforce-gtid-consistency=ON
配置复制:
-- 停止复制(如果已配置) STOP SLAVE; -- 传统方式配置 CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl_user', MASTER_PASSWORD='StrongPassword123!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; -- GTID方式配置(推荐) CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl_user', MASTER_PASSWORD='StrongPassword123!', MASTER_AUTO_POSITION=1; -- 启动复制 START SLAVE; -- 查看复制状态 SHOW SLAVE STATUS\G
检查复制状态:
-- 关键指标 Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 -- 延迟秒数 -- 错误信息 Last_IO_Error Last_SQL_Error
主库安装插件:
-- 安装半同步复制插件 INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; -- 启用半同步 SET GLOBAL rpl_semi_sync_master_enabled=1; SET GLOBAL rpl_semi_sync_master_timeout=1000;
从库安装插件:
-- 安装半同步复制插件 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; -- 启用半同步 SET GLOBAL rpl_semi_sync_slave_enabled=1;
查看半同步状态:
-- 主库查看 SHOW STATUS LIKE 'Rpl_semi_sync_master_status'; SHOW STATUS LIKE 'Rpl_semi_sync_master_clients'; -- 从库查看 SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
复制中断常见原因:
跳过复制错误:
-- 跳过一个事务(从库) STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE; -- 或者在my.cnf配置 slave-skip-errors=1062,1053
重新同步数据:
# 使用mysqldump重新备份主库 mysqldump -u root -p --single-transaction --master-data=2 app_db > app_db.sql # 导入从库 mysql -u root -p app_db < app_db.sql # 重新配置复制
复制延迟监控:
-- 查看延迟 SHOW SLAVE STATUS\G -- 监控脚本 #!/bin/bash delay=$(mysql -e "SHOW SLAVE STATUS" | grep "Seconds_Behind_Master" | awk '{print $2}') if [ $delay -gt 60 ]; then echo "警告:复制延迟 ${delay} 秒" fi
定期检查:
-- 检查从库状态 SELECT * FROM performance_schema.replication_connection_status; SELECT * FROM performance_schema.replication_applier_status; -- 检查binlog文件 SHOW BINARY LOGS;
应用层路由:
# Python示例 import mysql.connector class MySQLRouter: def __init__(self, master_config, slave_configs): self.master = mysql.connector.connect(**master_config) self.slaves = [mysql.connector.connect(**cfg) for cfg in slave_configs] def get_connection(self, read_only=False): if read_only: # 随机选择从库 return random.choice(self.slaves) else: return self.master
使用ProxySQL:
-- 配置读写分离规则 INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*', 10, 1); INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (2, 1, '^.*', 20, 1);
主从切换流程:
STOP SLAVE; RESET MASTER;
使用MHA自动故障转移:
MySQL主从复制是构建高可用、高性能数据库架构的基础。根据业务需求选择合适的复制模式,建立完善的监控和故障处理机制,确保数据安全和系统稳定。