深色模式
MySQL 主从复制搭建与延迟监控
摘要:主从复制是读写分离与高可用基础。本文用 GTID 模式搭建一主一从,配置从库只读,并给出延迟监控指标与典型复制报错的处理思路。
适用环境
bash
# 主库:确认 server_id 唯一、binlog 已开启
mysql -uroot -p -e "SELECT @@server_id, @@log_bin, @@gtid_mode;"
# 两台机器网络与端口互通
nc -zv 10.0.1.10 33061
2
3
4
5
2
3
4
5
操作步骤
1. 主库配置(/etc/my.cnf,改完重启)
ini
[mysqld]
server_id=1
log_bin=/data/mysql/data/binlog
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON1
2
3
4
5
6
2
3
4
5
6
2. 主库创建复制账号
sql
CREATE USER 'repl'@'10.0.1.%' IDENTIFIED BY 'ReplPass!2026';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.1.%';1
2
2
3. 从库配置(server_id 必须与主库不同)
ini
[mysqld]
server_id=2
relay_log=/data/mysql/data/relaylog
read_only=ON
super_read_only=ON
gtid_mode=ON
enforce_gtid_consistency=ON1
2
3
4
5
6
7
2
3
4
5
6
7
4. 主库数据初始化到从库
bash
mysqldump -uroot -p --single-transaction --master-data=2 --set-gtid-purged=ON \
--databases shopdb | gzip > /tmp/full.sql.gz
# 在从库导入
zcat /tmp/full.sql.gz | mysql -uroot -p1
2
3
4
2
3
4
5. 建立复制并启动
sql
CHANGE MASTER TO
MASTER_HOST='10.0.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass!2026',
MASTER_AUTO_POSITION=1; -- GTID 模式,无需手工填 binlog 位置
START SLAVE;
SHOW SLAVE STATUS\G1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
6. 监控复制状态与延迟
sql
SHOW REPLICA STATUS\G
-- 关键:Slave_IO_Running=Yes、Slave_SQL_Running=Yes、
-- Seconds_Behind_Master=0、Last_Error 为空1
2
3
2
3
bash
# 命令行快速巡检
mysql -uroot -p -e "SHOW REPLICA STATUS\G" | grep -E 'Running|Behind|Last_Error'1
2
2
危险
从库上写入会造成主从数据不一致。除 read_only 外务必开启 super_read_only,避免 SUPER 权限账号误写。
验证
sql
-- 主库写入一行
INSERT INTO shopdb.t_probe(id, v) VALUES (1, NOW());
-- 从库立即查询,能看到即为复制正常
SELECT * FROM shopdb.t_probe;
SELECT @@gtid_executed; -- 与主库对比 GTID 集合1
2
3
4
5
2
3
4
5
常见坑
WARNING
Seconds_Behind_Master 在主库长时间无写入时可能显示 0 但实际已断开;建议同时监控 Slave_IO_Running 与 GTID 差值。
WARNING
从库重启后复制不会自动恢复,需确认 START REPLICA(或配置 skip_replica_start=OFF)。
DANGER
复制报 1062(主键冲突)/1032(找不到记录)时,不要用 SET GLOBAL sql_slave_skip_counter 盲目跳过,会造成数据不一致;应先定位差异行再修复。
WARNING
大事务(一次更新几十万行)会造成从库延迟尖刺;上线前把大事务拆成小批次。