主 - 從複製設定

考慮 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_nameuser_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-logrelay-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 就會複製它。