SUPER 權限 (4.0.2 前為 PROCESS)GRANT REPLICATION SLAVE ON *.*
TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
-- 僅授予複寫權限,遵循最小權限原則
-- 若需支援 LOAD TABLE/DATA FROM MASTER (已棄用)
GRANT SUPER, RELOAD ON *.* TO 'repl'@'%.mydomain.com';
GRANT SELECT ON *.* TO 'repl'@'%.mydomain.com'; -- 目標表需 SELECT
-- Session 1 (保持連線,鎖才有效)
FLUSH TABLES WITH READ LOCK;
-- Session 2 (打包資料目錄)
tar -cvf /tmp/mysql-snapshot.tar /var/lib/mysql
# 或單庫:tar -cvf /tmp/mysql-snapshot.tar /var/lib/mysql/this_db
-- Session 1 記錄二進位日誌座標
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
-- Session 1 釋放鎖
UNLOCK TABLES;
關鍵點:File + Position 為 Slave 起始同步座標。**必須在 UNLOCK TABLES 前記錄**。
FLUSH TABLES WITH READ LOCK → SHOW MASTER STATUS → 記錄座標 → mysqladmin shutdown → 複製 ibdata*、ib_logfile*、*.frmmysqldump --master-data --single-transaction → 匯入 Slave。較慢但通用,無需鎖表 (InnoDB)。[mysqld]
log-bin
server-id=1 # 1 ~ 2^32-1,唯一
修改後重啟 Master。
[mysqld]
server-id=2 # 唯一,不可與 Master 及其他 Slave 重複
# 多 Slave 每個唯一 server-id,視同 IP 定址
啟動參數建議:--skip-slave-start (不自動連線)、--log-warnings (詳細日誌)。
# 解壓至 Slave 資料目錄
tar -xvf /tmp/mysql-snapshot.tar -C /var/lib/mysql
# 權限修正
chown -R mysql:mysql /var/lib/mysql
邏輯備份 (mysqldump) 則直接啟動 Slave 後匯入:mysql -u root -p < dump.sql。
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.003',
MASTER_LOG_POS=73;
START SLAVE;
參數長度限制:MASTER_HOST 60、MASTER_USER 16、MASTER_PASSWORD 32、MASTER_LOG_FILE 255 字元。
SHOW SLAVE STATUS\G
-- 關鍵欄位
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Last_Error: (空)
資料目錄下會產生 master.info、relay-log.info,**勿手動修改**,改用 CHANGE MASTER TO。
同一份 Master 快照可部署無數 Slave:
server-idCHANGE MASTER TO + START SLAVE無需再次鎖定 Master 或重新備份。
| 現象 | 原因 | 解決 |
|---|---|---|
| Slave 無法連線 Master | Master 未設 server-id 或 log-bin | 檢查 Master 配置並重啟 |
Slave 錯誤日誌:server-id not set | Slave 未設 server-id | 設定唯一 server-id 重啟 |
| 複寫延遲大 | Slave 查詢慢、單執行緒 SQL、網路慢 | 優化 Slave 查詢、升級 5.6+ 多執行緒複寫、壓縮協議 |
| 主從資料不一致 | Slave 直接寫入、非確定性函數、跳過錯誤 | read-only、binlog_format=ROW、定期 pt-table-checksum 校驗 |
| 中繼日誌損壞 | 磁碟滿、強制關機 | STOP SLAVE → 刪除 relay-log* → CHANGE MASTER TO 重設座標 → START SLAVE |
gtid_mode=ON、enforce_gtid_consistency=ON,自動定位座標,故障切換零配置slave_parallel_workers=4 (5.6+)、slave_parallel_type=LOGICAL_CLOCK (5.7+)rpl_semi_sync_master=ON,Master 等待至少一 Slave 收到才提交,降低資料遺失風險複寫不是備份,也不替代備份。複寫解決高可用與讀擴展,備份解決邏輯錯誤、惡意破壞、災難恢復。兩者皆不可缺。