本文基於 MySQL 5.6+(推薦 5.7/8.0)詳細記錄基於 GTID 的主從復制搭建步驟,涵蓋安裝、配置、啟動、驗證、故障切換準備,適用於讀寫分離、有限高可用架構。
| 項目 | Master | Slave |
|---|---|---|
| OS | CentOS 7 / Ubuntu 20.04 | 同 |
| MySQL | 5.7.x / 8.0.x(版本一致) | 同 |
| IP | 10.0.1.10 | 10.0.1.20 |
| Server ID | 10 | 20 |
確保雙節點版本一致、字符集 utf8mb4、時區一致(system 或 UTC)。
/etc/my.cnf[mysqld] server-id = 10 log-bin = mysql-bin binlog-format = ROW gtid-mode = ON enforce-gtid-consistency = ON log-slave-updates = 1 # 從庫也需開啟,支持鏈式復制 skip-name-resolve max_connections = 2000 innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 # 最高數據安全 # 半同步復制(可選,推薦) rpl_semi_sync_master_enabled = 1 rpl_semi_sync_master_timeout = 1000
/etc/my.cnf[mysqld] server-id = 20 log-bin = mysql-bin # 從庫也開 binlog,支持鏈式/備庫升主 binlog-format = ROW gtid-mode = ON enforce-gtid-consistency = ON log-slave-updates = 1 skip-name-resolve read-only = 1 # 防止誤寫入 super-read-only = 1 # 8.0+,連 super 用戶也限制 relay-log = relay-bin relay-log-recovery = 1 # 啟動時自動修復損壞 relay log
-- Master 執行 CREATE USER 'repl'@'10.0.1.%' IDENTIFIED BY 'ReplPassw0rd!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.1.%'; FLUSH PRIVILEGES;
# Master 備份 xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx # 傳輸到 Slave rsync -av /backup/full/ slave:/var/lib/mysql/ # Slave 恢復 xtrabackup --prepare --target-dir=/var/lib/mysql chown -R mysql:mysql /var/lib/mysql systemctl start mysqld
# Master mysqldump --all-databases --single-transaction --master-data=2 --flush-logs --gtid --routines --triggers -uroot -p > full.sql # Slave mysql -uroot -p < full.sql
-- Slave 執行
CHANGE MASTER TO
MASTER_HOST = '10.0.1.10',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'ReplPassw0rd!',
MASTER_AUTO_POSITION = 1; -- GTID 核心:無需指定 File/Position
START SLAVE;