要做 MySQL 主從關系的設置,需要有兩台 MySQL 主機。所以在開始配置之前需要准備兩個 MySQL 服務器,可以是在虛擬機裡安裝,也可以在真實機器上安裝。
最好是在主/從服務器上安裝相同的 MySQL 版本。或者是 slave 上的 MySQL 版本要高於 Master 上的版本。另外,推薦是選擇較新的正式的 MySQL 版本。
MySQL 手冊中對配置主從復制架構的提示和建議:
1. We recommend using the most recent MySQL version available because replication capabilitIEs are continually being improved.
2. We also recommend using the same version for both the master and the slave.
3. We recommend upgrading masters and slaves running alpha or beta versions to new (production) versions.
4. Replication from a 5.0.3 master to a 5.0.2 slave will fail; from a 5.0.4 master to a 5.0.3 slave will also fail.
5. In general, slaves running MySQL 5.0.x may be used with older masters(even those running MySQL 3.23, 4.0, or 4.1), but not the reverse.
6. You cannot replicate from a master that uses a newer binary log format to a slave that uses an older format (for example, from MySQL 5.0 to MySQL 4.1.)
7. The binary log format as implemented in MySQL 5.0 is considerably different from that used in previous versions. Major changes were made in MySQL 5.0.3(for improvements to handling of character sets and LOAD DATA INFILE) and 5.0.4 (for improvements to handling of time zones).
一、操作環境說明
主機(master):
Windows Server 2003,IP:10.0.0.101
MySQL版本:MySQL-essential-5.1.47-win32.msi
MySQL 安裝路徑:D:\MySQLServer5.1
從機(slave):
Windows Server 2003,IP:10.0.0.102
MySQL版本:MySQL-essential-5.1.47-win32.msi
MySQL 安裝路徑:D:\MySQLServer5.1
其他相關軟件:
MySQL 管理客戶端:
Navicat 8 for MySQL(Windows)
本文的實驗環境是在 Vmware workstation 7.0 虛擬機下搭建的。
二、配置 MySQL 主機(master):
首先打開 MySQL 服務器的配置文件 my.ini(Linux 下是文件 my.cnf),一般都在 MySQL 安裝目錄下,本實驗中在 D:\MySQLServer5.1 下。記得先備份以下原來的配置文件。然後在 my.ini 文件末尾加入下面的代碼:
#Master Config
server-id = 1
log-bin = MySQL-bin
binlog-do-db = test
binlog-ignore-db = MySQL
注意上面這幾項配置,如果在配置文件中已經存在就不用添加了(MySQL5.0較早的版本中有,本實驗的5.1.47版本沒有)。注意都是小寫字母。
上面的這些配置的含義:
- server-id 顧名思義就是服務器標識id號了
- log-bin 指定日志類型
- binlog-do-db 是你需要復制的數據庫名稱,如果有多個就用逗號“,”分開
- binlog-ignore-db 是不需要復制的數據庫名稱,如果有多個就用逗號“,”分開
然後添加一個用戶,用於從服務器訪問:
很多教程使用 MySQL 命令行(CLI)命令來操作,我們這裡使用 MySQL 圖形界面的管理客戶端 Navicat 來操作,結果是一樣的。
連接到 10.0.0.101 上的 MySQL 服務器,進入用戶管理界面,建立一個用戶 slave,密碼也是 slave。主機填寫“10.%”,意味著只允許該賬戶從 IP 地址開頭為“10”的主機上連接。當然填寫“%”也可以。
賬戶權限:需要為 slave 賬戶開放“全局許可權”:Reload、Super、Replication Slave、Replication ClIEnt。因為配置中是對 test 數據庫進行復制,所以還要開放該對數據庫 test 的一切權限。
用 MySQL 命令行操作的話,請參考以下形式的語句:
grant usage on *.* to 'slave'@'10.%' identifIEd by 'slave';
該命令就是添加一個用戶了。“@”前面的“slave”是用戶名,後面的是有效的域,“10.%”也就是說以“10”開頭的任意IP都能使用這個帳號訪問這台 MySQL 服務器,也可以設置成固定的 I P比如“10.0.0.102”。by 後面的“slave”是密碼。
MySQL 主服務器配置完畢。把 MySQL 服務重新啟動一下,在命令行窗口中執行:
net stop mysql //關閉MySQL服務
net start mysql //開啟MySQL服務
當然也可以在 Windows 服務管理控制台操作 MySQL 服務。
三、配置 MySQL 從機(slave):
打開從服務器的配置文件 my.ini,同樣在末尾加入下面的代碼:
# Slave Config
server-id = 2
master-host = 10.0.0.101
master-port = 3306
master-user = slave
master-passWord = slave
replicate-do-db = test
下面來解釋下:
Server-id 從服務器標識id號
Master-host 主服務器的 IP 地址
Master-port 主服務器的端口
Master-user 用於和主服務器同步數據的用戶名,我們在配置主服務器時已經添加了,即slave
Master-passWord 就是 Master-user 的密碼
Replicate-do-db 要備份的數據庫名稱
注意,如果 my.ini 文件中原來就有一個 server-id=1 的配置,需要刪除掉(MySQL5.0較早的版本中有,本實驗的5.1.47版本沒有)。配置語句也都是小寫字母。
重啟從服務器上的 MySQL 服務。
四、測試
登錄到從服務器命令行界面,執行以下命令,查看從服務器的配置是否正確:
Show slave status;
執行後會顯示很多東西, 然後找到下面這兩項:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果兩項都是 Yes 那麼就配置成功了。如果不全是 Yes,則有可能是主服務器上 slave 賬戶的權限配置問題,需要反復檢查。
接著執行命令:
load data from master;
這個命令就是從主服務器載入數據。本命令用於對主服務器進行快照,並拷貝到從屬服務器上。它可以更新MASTER_LOG_FILE和MASTER_LOG_POS的值,這樣,從屬服務器就可以從正確的位置開始進行復制。使用--replicate-*-do-*和--replicate-*-ignore-*選項指定的表和數據庫排除規則均被兌現。--
如果命令執行後顯示信息“Query OK, 0 rows affected (0.13 sec)”,則說明正確執行了數據復制。
本“load data from master”語句只對 MyISAM 類型的表起作用。如果試圖載入一個非MyISAM表,會導致以下錯誤:
ERROR 1189 (08S01): Net error reading from master
並且當拍攝快照時,會獲得對主服務器的全局讀取鎖定。在載入操作期間,該鎖定會阻止對主服務器的更新。
然後,在主服務器建表和增刪記錄,應該在從服務器中看到對應的變化。說明配置成功了。
五、MySQL 主從復制錯誤的處理
MySQL 主從復制架構配置成功後,首先應該在主服務器上鎖住表,然後備份數據,同步到從服務器上。
flush tables with read lock;
-- copy data files ...
unlock tables;
或者是通過 MySQLdump 工具來備份和同步數據:
MySQLdump --user=root --passWord=xxxx --master-data=1 --all-databases > dbsnapshot.sql
然後主從復制開始正確工作。
如果主服務器已經存在一定數量的數據,或從服務器由於某些原因中斷了同步的進程,這個時候可以按照以下的步驟來重新同步:
1、從主服務器導出欲同步的數據庫;
2、在從服務器運行 stop slave 停止同步;
3、導入第1步的數據庫到從服務器;
4、在從服務器上運行 start slave 開始同步。