MySQL 主從複製設定完整教學 文章首圖

MySQL 主從複製設定完整教學

MySQL 主從複製設定完整教學

在現代架構中,資料庫的高可用性與讀寫分離是系統穩定性的關鍵。MySQL 主從複製(Master-Slave Replication)正是實現這一目標最經典且實用的方案。透過將寫入操作集中於主節點(Master),而將讀取操作分散至多個從節點(Slave),我們不僅能提升系統的吞吐量,還能為資料備份提供實時機制。

本文將以 Ubuntu 22.04 和 Debian 12 為基礎,帶您逐步完成 MySQL 主從複製的設定。請確保您擁有兩台已安裝好 MySQL Server 的伺服器,並具備 sudo 權限。

前置準備與環境確認

在開始設定之前,請先確認兩台伺服器上的 MySQL 版本一致,以避免相容性問題。同時,請確保兩台伺服器之間可以透過網路互相通訊。

我們假設:

  • Master IP192.168.1.10
  • Slave IP192.168.1.20

第一步:設定 Master(主節點)

首先,我们需要修改 Master 上的 MySQL 設定檔,使其啟用二進位日誌(Binary Log),這是複製機制的基础。

使用文字編輯器開啟 MySQL 設定檔:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 server-idbind-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_HOSTMASTER_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_RunningSlave_SQL_Running 兩個欄位,它們都必須顯示為 Yes。如果出現錯誤,請查看 Last_Error 欄位進行除錯。

常見問題與解決

  1. Slave_IO_Running: Connecting 這通常表示網路防火牆阻擋了連線,或是 Master 上的 bind-address 設定錯誤,導致 Slave 無法連線。請檢查兩台機器的防火牆設定(如 ufwiptables),確保 TCP 3306 埠已開放。

  2. Slave_SQL_Running: No 這表示 SQL 執行階段發生錯誤,可能是資料結構不一致或語法衝突。您可以暫時跳過錯誤繼續複製(僅供緊急除錯,不建議長期使用):

    STOP SLAVE;
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE;

    長期解決方法通常是重新執行完整的主從同步設定。

小結

透過上述步驟,您已成功建立了 MySQL 主從複製架構。這不僅提升了讀取效能,也為資料安全性提供了保障。建議後續可結合 Keepalived 或 ProxySQL 等工具,進一步實現自動故障轉移與負載平衡,打造更健壯的資料庫叢集。