MySQL 複製 是一個有趣的功能,允許使用者管理一個或多個 MySQL 資料庫的多個複本。資料會自動從 來源 複製到 副本 資料庫。這在許多情況下都很有用,例如在不影響主資料庫的情況下處理資料、進行資料備份或擴展資料庫存取等。
在本指南中,我們將逐步介紹在一台伺服器上設定 MySQL 執行個體作為來源資料庫,然後在另一台伺服器上設定 MySQL 執行個體以作為其副本的步驟.
先決條件
本指南將示範一個非常簡單的 MySQL 複製範例。它涉及一個 來源 和一個 副本 資料庫。該 來源 資料庫是資料庫的主要複本,而 副本 資料庫將是 來源 資料庫的複本。在我們的示範中,兩台伺服器配置了以下 IP 地址:
- 來源伺服器:31.171.240.179
- 副本伺服器:31.171.250.139
每台伺服器都配置了最新的 Ubuntu 20.04 server 配置。首先,請按照教學中的步驟,該教學展示了 如何設定您的 Ubuntu 伺服器。請注意,副本資料庫的數量可以更多。本指南假設您已經安裝並配置了 MySQL。需要安裝 MySQL 的協助嗎?本指南深入示範了 MySQL 安裝與基本使用方法.
簡而言之,以下是您需要的套件:
|
1 |
$ sudo apt install mysql-server mysql-client |
兩台系統上的防火牆都應配置為允許來自兩台系統在連接埠 3306 上的流量。這是 MySQL 的預設連接埠。您可以從我們的部落格文章中了解更多關於 UFW 基本概念與示範 的資訊。
來源資料庫配置
-
微調 MySQL 配置
MySQL 使用 my.cnf 作為主要配置檔案。我們將更新 my.cnf 以將該伺服器指定為 來源。首先,使用文字編輯器開啟配置檔案:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
然後,在 mysqld 區段下新增以下行:
|
1 2 3 4 |
bind-address = 31.171.240.179 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = newdatabase |
這些行是什麼意思?
bind-address: 這是定義服務與 IP 地址之間關聯的項目。預設情況下,該值可能是127.0.0.1(localhost)。新值將是伺服器的 IP 地址。server-id: 在 MySQL 複製中,每台伺服器都必須有一個唯一的伺服器 ID。它可以是任何數字。為了簡單起見,它被設置為1.log_bin: 它儲存複製的實際詳細資訊。副本資料庫將複製日誌中記錄的所有內容。binlog_do_db: 此項目指定將在副本伺服器上進行複製的資料庫。可以有多個資料庫。在這裡,範例資料庫是newdatabase.
進行變更後,儲存配置檔案。MySQL 需要重新啟動才能將變更載入到 my.cnf:
|
1 |
$ sudo service mysql restart |
-
授予副本使用者權限
下一步是建立副本使用者並授予適當的權限。這需要從 MySQL shell 中進行。首先,啟動 MySQL shell:
|
1 |
$ sudo mysql -u root -p |
接下來,為副本資料庫建立一個專用使用者。請適當變更使用者名稱和密碼:
|
1 |
$ CREATE USER 'cloudsigma_s'@'31.171.240.179' IDENTIFIED BY 'password_123'; |
現在,向該使用者授予適當的權限:
|
1 |
$ GRANT REPLICATION SLAVE ON *.* TO 'cloudsigma_s'@'31.171.240.179'; |
您可以從我們的部落格文章中了解更多關於 MySQL 使用者與權限 的資訊。接下來,重新載入授權表以使變更生效:
|
1 |
$ FLUSH PRIVILEGES; |
-
微調資料庫
我們需要在副本上複製一份來源資料庫。手動建立結構是可行的。然而,在大多數情況下,這相當不便。這就是為什麼直接匯出資料庫是最理想的解決方案。在此範例中,來源資料庫是 newdatabase。變更目前的資料庫:
|
1 |
$ USE newdatabase; |
以下指令將鎖定資料庫,以防止任何新的變更:
|
1 |
$ FLUSH TABLES WITH READ LOCK; |
然後,檢查資料庫狀態:
|
1 |
$ SHOW MASTER STATUS; |
從這個位置開始,副本資料庫將開始從來源進行複製。這些數字稍後會很有用,因此請將它們記錄下來。如果從同一個視窗進行任何變更,MySQL 將會自動解鎖資料庫。因此,建議在不同的終端機分頁或視窗中執行以下步驟。資料庫目前仍處於鎖定狀態。將其匯出為可攜式 SQL 檔案:
|
1 |
$ mysqldump -u root -p --opt newdatabase > newdatabase.sql |
任務現已完成。接下來,解鎖資料庫:
|
1 |
$ UNLOCK TABLES; |
最後,退出 shell:
|
1 |
$ QUIT; |
副本設定
現在是設定副本資料庫的時候了。
-
匯入來源資料庫
我們需要在副本伺服器上複製一份來源資料庫。我們將使用先前匯出的 SQL 檔案來執行此操作。啟動 MySQL shell:
|
1 |
$ sudo mysql -u root -p |
之後,使用相同的資料庫名稱建立一個空白資料庫:
|
1 |
$ CREATE DATABASE newdatabase; |
接下來,退出 shell:
|
1 |
$ EXIT; |
現在,將 SQL 檔案匯入資料庫:
|
1 |
$ sudo mysql -u root -p newdatabase < newdatabase.sql |
-
微調 MySQL 設定
在 MySQL 設定檔中需要宣告幾件事。在文字編輯器中開啟設定檔:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
以下項目將放在 mysqld 區段下。否則,它將無法運作。第一個是伺服器 ID。如前所述,它在來源-副本複製設定中的所有伺服器中必須是唯一的。為了進行示範,它被設定為 2:
|
1 |
$ server-id = 2 |
接下來,新增以下幾行:
|
1 2 3 |
$ relay-log = /var/log/mysql/mysql-relay-bin.log $ log_bin = /var/log/mysql/mysql-bin.log $ binlog_do_db = newdatabase |
在這裡,只有 relay-log 是新項目。它是副本伺服器在複製期間建立的記錄檔。記錄檔格式與二進位記錄檔相同。儲存設定檔,然後重新啟動 MySQL:
|
1 |
$ sudo service mysql restart |
-
啟用複製
最後,我們準備好在 MySQL 中啟用複製。啟動 MySQL shell:
|
1 |
$ sudo mysql -u root -p |
執行以下指令。首先,相應地變更 IP 位址、使用者名稱和密碼:
|
1 |
$ CHANGE MASTER TO MASTER_HOST='31.171.240.179',MASTER_USER='cloudsigma_master', MASTER_PASSWORD='password_123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107; |
該指令完成了以下操作:
- 目前的伺服器被標記為來源伺服器的副本。
- 副本伺服器具有正確的登入憑證。
- 副本伺服器知道從哪裡開始進行複製。還記得我們在來源伺服器上檢查的資料庫狀態嗎?來源記錄檔和記錄位置就是從那裡來的。
最後,啟用副本伺服器:
|
1 |
$ START REPLICA; |
-
其他
需要檢查副本目前狀態的詳細資訊嗎?在 MySQL shell 中執行以下指令。結尾的 \G 是為了重新排列文字,使其更具可讀性:
|
1 |
$ SHOW REPLICA STATUS\G |
如果存在連線問題,請嘗試啟動副本伺服器以跳過它:
|
1 |
$ SET GLOBAL SQL_REPLICA_SKIP_COUNTER = 1; REPLICA START; |
結論
MySQL 複寫涉及許多層面。這只是其基本形式的簡短示範。然而,它可以輕鬆擴展到多個來源-複寫配置。相同的步驟也適用於任何更高階的複雜配置。在完成後測試任何配置始終是個好主意。嘗試執行一些 insert, delete 或 update 指令於來源資料庫。如果設定正常運作,則複寫資料庫應該要能正確同步所有內容。
此外,您可以查看我們部落格中的更多資源,了解您可以使用 MySQL 做些什麼:
- SQLite vs MySQL vs. PostgreSQL:關聯式資料庫管理系統比較
- 如何重設 MariaDB 或 MySQL Root 密碼
- 如何在 Ubuntu 20.04 上安裝 LEMP 堆疊 (Linux, Nginx, MySQL PHP)
祝您運算愉快!







留言
目前尚無留言。成為第一個留言的人吧。