本文記錄在 CentOS 環境下搭建 MySQL 主從復制的完整步驟,涵蓋防火牆/SELinux 關閉、主庫 Binlog 配置、從庫 CHANGE MASTER TO 動態配置、啟動驗證、故障排查、測試驗證全鏈路。兼容 MySQL 5.6+(傳統位點)與 5.7+(GTID)兩種模式。
| 角色 | IP | Server_ID | MySQL 版本 |
|---|---|---|---|
| Master | 192.168.1.222 | 1 | 5.7.x |
| Slave | 192.168.1.137 | 2 | 5.7.x |
前置操作(雙節點):
systemctl stop firewalld; systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot # 生效需重啟
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-do-db=repl
binlog-ignore-db=mysql,information_schema,performance_schema
gtid-mode=ON
enforce-gtid-consistency=ON
log-slave-updates=1
systemctl restart mysqld
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPass123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 98 | repl | mysql,... | xxxxxxxx:1-10 |
+------------------+----------+--------------+------------------+-------------------+
UNLOCK TABLES;
[mysqld]
server-id=2
relay-log=relay-bin
log-slave-updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
read-only=1
systemctl restart mysqld
-- 傳統位點模式
CHANGE MASTER TO
MASTER_HOST='192.168.1.222',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=98,
MASTER_CONNECT_RETRY=60;
-- GTID 模式(5.7+,無需位點,自動定位)
CHANGE MASTER TO
MASTER_HOST='192.168.1.222',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass123',
MASTER_PORT=3306,
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: (空)
| 現象 | 原因 | 解決 |
|---|---|---|
| ERROR 1200: not configured as slave | 未執行 CHANGE MASTER TO | 執行完整 CHANGE MASTER TO 後 START SLAVE |
| Slave_SQL_Running: No | SQL 線程報錯停止 | 查看 Last_SQL_Error,修正數據衝突後 STOP SLAVE; START SLAVE; |
| Slave_IO_Running: Connecting | 網絡不通/賬號密碼錯/防火牆 | telnet master 3306、檢查賬號、開放端口 |
| Seconds_Behind_Master 偏大 | 從庫硬件弱/大事務/長查詢阻塞 | 優化從庫硬件、並行復制 slave_parallel_workers |
| Duplicate entry 錯誤 (1062) | 主庫寫入未同步前從庫已有數據 | 跳過錯誤 SET GLOBAL sql_slave_skip_counter=1; 或重新搭建從庫 |
-- Master 執行
USE repl;
CREATE TABLE test_sync (id INT, name CHAR(10));
INSERT INTO test_sync VALUES (1, 'zaq'), (2, 'xsw');
-- Slave 查詢
USE repl;
SELECT * FROM test_sync;
-- 應返回相同兩行,同步成功
Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Running 三大核心指標,納入告警體系。CHECKSUM TABLE 或 pt-table-checksum 校驗數據一致性。CHANGE MASTER TO MASTER_AUTO_POSITION=1 實現無感故障轉移(GTID 必備)。STOP SLAVE SQL_THREAD)做邏輯/物理備份,不影響主庫。掌握傳統位點與 GTID 雙模式配置,可應對從 MySQL 5.5 到 8.0 的所有版本主從搭建場景,構建高可用 MySQL 架構的基石。