MySQL 3.23.15+ 引入複製功能,支援主從 (Master-Slave)與雙主 (Master-Master)架構,是高可用、讀寫分離、異地災備的基石。本文基於 RedHat Linux 9 + MySQL 4.0.18,給出生產級部署全流程。
| 角色 | IP | Server ID | 數據目錄 |
|---|---|---|---|
| Master (A) | 192.168.0.1 | 1 | /usr/local/mysql/data |
| Slave (B) | 192.168.0.10 | 2 | /usr/local/mysql/data |
共同前提:版本一致、字符集一致、server-id 唯一、防火牆放行 3306。
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
TO 'repl_user'@'192.168.0.10' IDENTIFIED BY 'ReplPass123!';
FLUSH PRIVILEGES;
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = business_db # 僅同步指定庫
sync_binlog = 1
expire_logs_days = 7
max_binlog_size = 500M
innodb_flush_log_at_trx_commit = 1
sync_relay_log = 1
systemctl restart mysqld
mysql -u root -p -e "SHOW MASTER STATUS;"
# 記下 File (如 mysql-bin.000001) 和 Position (如 154)
# 方法一:全庫鎖定 (短暫)
mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
mysqldump -u root -p --all-databases --master-data=2 --single-transaction > /tmp/full.sql
mysql -u root -p -e "UNLOCK TABLES;"
# 方法二:XtraBackup 熱備無鎖 (推薦生產)
# xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx
[mysqld]
server-id = 2
relay-log = mysql-relay
relay-log-index = mysql-relay.index
log-slave-updates = 1
replicate-do-db = business_db
read-only = 1 # 防止誤寫入
master-connect-retry = 60
scp root@192.168.0.1:/tmp/full.sql /tmp/
mysql -u root -p < /tmp/full.sql
# 或 XtraBackup 複製回 datadir 並 chown mysql:mysql
CHANGE MASTER TO
MASTER_HOST = '192.168.0.1',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'ReplPass123!',
MASTER_PORT = 3306,
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 154,
MASTER_CONNECT_RETRY = 60;
START SLAVE;
SHOW SLAVE STATUS\G
# 關鍵指標:Slave_IO_Running=Yes, Slave_SQL_Running=Yes, Seconds_Behind_Master=0
在 Slave (B) 亦開啟 Binlog,並互為對方的 Master。
[mysqld]
master-host = 192.168.0.10
master-user = repl_user
master-password = ReplPass123!
master-connect-retry = 10
replicate-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 1
[mysqld]
log-bin = mysql-bin
binlog-do-db = business_db
auto-increment-increment = 2
auto-increment-offset = 2
關鍵: auto_increment_increment/offset 避免雙主自增 ID 衝突;僅對單向寫入應用推薦雙主,雙向寫入極易衝突,生產建議改用 MGR (MySQL Group Replication) 或 Galera Cluster。
Seconds_Behind_Master = 0 正常;> 300 告警。Slave_IO_Running / Slave_SQL_Running 任一 No 立即告警。.err 關鍵字:Duplicate entry, Deadlock, Table doesn't exist。| 故障 | 修復步驟 |
|---|---|
| SQL 線程報錯停止 (如主鍵衝突) | STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE; (謹慎使用,可能導致數據不一致) |
| IO 線程連不上 Master | 檢查網絡、防火牆、賬號密碼、MASTER_LOG_FILE/POS 是否正確 |
| Relay Log 損壞 | STOP SLAVE; RESET SLAVE; 重新 CHANGE MASTER TO ...; START SLAVE; |
| 主從數據不一致 | pt-table-checksum 檢測 → pt-table-sync 修復 (需停寫或鎖表) |