主 - 從複製設定
考慮 2 個 MySQL 伺服器進行復制設定,一個是 Master,另一個是 Slave。
我們將配置 Master,它應該記錄對其執行的每個操作的日誌。我們將配置 Slave 伺服器,它應該檢視 Master 上的日誌,並且每當主伺服器上的日誌發生更改時,它應該執行相同的操作。
主配置
首先,我們需要在 Master 上建立一個使用者。Slave 將使用此使用者與 Master 建立連線。
CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;
根據你的使用者名稱和密碼更改 user_name
和 user_password
。
現在應該編輯 my.inf
(Linux 中的 my.cnf)檔案。在[mysqld]部分中包含以下行。
server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database
第一行用於為此 MySQL 伺服器分配 ID。
第二行告訴 MySQL 開始在指定的日誌檔案中寫入日誌。在 Linux 中,這可以配置為 log-bin = /home/mysql/logs/mysql-bin.log
。如果要在已使用複製的 MySQL 伺服器中啟動複製,請確保此目錄中沒有所有複製日誌。
第三行用於配置我們要寫入日誌的資料庫。你應該將 your_database
替換為你的資料庫名稱。
確保未啟用 skip-networking
並重啟 MySQL 伺服器(Master)
從屬配置
my.inf
檔案也應該在 Slave 中編輯。在[mysqld]部分中包含以下行。
server-id = 2
master-host = master_ip_address
master-connect-retry = 60
master-user = user_name
master-password = user_password
replicate-do-db = your_database
relay-log = slave-relay.log
relay-log-index = slave-relay-log.index
第一行用於為此 MySQL 伺服器分配 ID。此 ID 應該是唯一的。
第二行是主伺服器的 IP 地址。根據你的主系統 IP 更改此設定
第三行用於設定重試限制,以秒為單位。
接下來的兩行告訴 Slave 的使用者名稱和密碼,通過使用它來連線 Master。
下一行設定需要複製的資料庫。
最後兩行用於分配 relay-log
和 relay-log-index
檔名。
確保未啟用 skip-networking
並重啟 MySQL 伺服器(Slave)
將資料複製到從屬
如果資料不斷新增到 Master 中,我們將不得不阻止 Master 上的所有資料庫訪問,因此無法新增任何內容。這可以通過在 Master 中執行以下語句來實現。
FLUSH TABLES WITH READ LOCK;
如果沒有資料新增到伺服器,則可以跳過上述步驟。
我們將使用 mysqldump
來獲取 Master 的資料備份
mysqldump your_database -u root -p > D://Backup/backup.sql;
根據你的設定更改 your_database
和備份目錄。你現在將在給定的位置有一個名為 backup.sql
的檔案。
如果你的資料庫中不存在你的資料庫,請通過執行以下操作來建立該資料庫
CREATE DATABASE `your_database`;
現在我們必須將備份匯入 Slave MySQL 伺服器。
mysql -u root -p your_database <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup
開始複製
要開始複製,我們需要在 Master 中找到日誌檔名和日誌位置。因此,在 Master 中執行以下命令
SHOW MASTER STATUS;
這將為你提供如下輸出
+---------------------+----------+-------------------------------+------------------+
| `File` | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001 | 130 | your_database | |
+---------------------+----------+-------------------------------+------------------+
然後在 Slave 中執行以下命令
SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name',
MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;
首先我們阻止 slave。然後我們告訴它在 Master 日誌檔案中的確切位置。對於 MASTER_LOG_FILE
name 和 MASTER_LOG_POS
,使用我們在 Master 上執行 SHOW MASTER STATUS
命令得到的值。
你應該在 MASTER_HOST
中更改 Master 的 IP,並相應地更改使用者和密碼。
slave 現在正在等待。可以通過執行以下命令檢視從站的狀態
SHOW SLAVE STATUS;
如果你之前在 Master 中執行了 FLUSH TABLES WITH READ LOCK
,請通過執行以下命令從鎖定中釋放表
UNLOCK TABLES;
現在,Master 會為其上執行的每個操作保留一個日誌,而 Slave 伺服器會檢視 Master 上的日誌。每當登入 Master 時發生更改,Slave 就會複製它。