MySQL 主從複製設定完整教學
在現代架構中,資料庫的高可用性與讀寫分離是系統穩定性的關鍵。MySQL 主從複製(Master-Slave Replication)正是實現這一目標最經典且實用的方案。透過將寫入操作集中於主節點(Master),而將讀取操作分散至多個從節點(Slave),我們不僅能提升系統的吞吐量,還能為資料備份提供實時機制。
本文將以 Ubuntu 22.04 和 Debian 12 為基礎,帶您逐步完成 MySQL 主從複製的設定。請確保您擁有兩台已安裝好 MySQL Server 的伺服器,並具備 sudo 權限。
前置準備與環境確認
在開始設定之前,請先確認兩台伺服器上的 MySQL 版本一致,以避免相容性問題。同時,請確保兩台伺服器之間可以透過網路互相通訊。
我們假設:
- Master IP:
192.168.1.10 - Slave IP:
192.168.1.20
第一步:設定 Master(主節點)
首先,我们需要修改 Master 上的 MySQL 設定檔,使其啟用二進位日誌(Binary Log),這是複製機制的基础。
使用文字編輯器開啟 MySQL 設定檔:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到 server-id 和 bind-address 欄位。server-id 必須是唯一的整數,通常 Master 設為 1。請取消註解 bind-address 並將其設為 Master 的 IP 地址,以便 Slave 可以連線。同時,確保 log_bin 已啟用。設定如下:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
bind-address = 192.168.1.10
儲存後,重新啟動 MySQL 服務:
sudo systemctl restart mysql
接著,進入 MySQL 命令列,建立一個專門用於複製的使用者帳號 repl_user,並授予複製權限:
sudo mysql
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
注意:FLUSH TABLES WITH READ LOCK 會鎖定資料庫,請在下一個步驟完成快照後立即解鎖。現在,請開啟另一個終端視窗,使用 mysqldump 匯出 Master 的資料:
mysqldump -u root -p --all-databases --master-data=2 > master_backup.sql
匯出完成後,回到第一個終端視窗,解開鎖定:
UNLOCK TABLES;
EXIT;
第二步:設定 Slave(從節點)
將剛才匯出的 master_backup.sql 檔案傳輸至 Slave 伺服器,並匯入資料庫:
sudo mysql -u root -p < master_backup.sql
接下來,修改 Slave 的 MySQL 設定檔:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
設定 Slave 的 server-id(必須與 Master 不同,例如 2),並確保 relay-log 已啟用:
[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
重新啟動 Slave 的 MySQL 服務:
sudo systemctl restart mysql
最後,在 Slave 上連線至 Master 並啟動複製程序。請將 MASTER_HOST、MASTER_USER 和密碼替換為您實際的資訊:
sudo mysql
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl_user',
MASTER_PASSWORD='StrongPassword123!',
MASTER_LOG_FILE='mysql-bin.000001', -- 請查看 master_backup.sql 中的 binlog 檔名
MASTER_LOG_POS=154; -- 請查看 master_backup.sql 中的 position 數值
START SLAVE;
驗證複製狀態
在 Slave 上執行以下指令,檢查複製是否正常運作:
SHOW SLAVE STATUS\G
請特別關注 Slave_IO_Running 和 Slave_SQL_Running 兩個欄位,它們都必須顯示為 Yes。如果出現錯誤,請查看 Last_Error 欄位進行除錯。
常見問題與解決
-
Slave_IO_Running: Connecting 這通常表示網路防火牆阻擋了連線,或是 Master 上的
bind-address設定錯誤,導致 Slave 無法連線。請檢查兩台機器的防火牆設定(如ufw或iptables),確保 TCP 3306 埠已開放。 -
Slave_SQL_Running: No 這表示 SQL 執行階段發生錯誤,可能是資料結構不一致或語法衝突。您可以暫時跳過錯誤繼續複製(僅供緊急除錯,不建議長期使用):
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;長期解決方法通常是重新執行完整的主從同步設定。
小結
透過上述步驟,您已成功建立了 MySQL 主從複製架構。這不僅提升了讀取效能,也為資料安全性提供了保障。建議後續可結合 Keepalived 或 ProxySQL 等工具,進一步實現自動故障轉移與負載平衡,打造更健壯的資料庫叢集。