使用MySQL複製功能可以將主服務器上的數據複製到多臺從服務器上。默認情況下複製是異步傳輸方式,從服務器不需要總是連接主服務器去更新數據。也就是說數據更新可以在遠距離連接的情況下進行,甚至是在使用撥號網絡的臨時連接環境下也可以進行。根據自定義設置,我們可以對所有數據庫或部分數據庫甚至是部分數據表進行復制。通過主從複製,在企業級應用環境中就不必再擔心數據庫的單點故障,當一臺服務器宕機時其他服務器一樣可以提供非常穩定可靠的數據服務。
2. MySQL複製的優勢:
高性能:通過將請求分配給多臺不同的從服務器提高性能與速度。在這種環境中,所有對數據庫的寫操作必須提供給主服務器,但讀操作可以被平均地分配給多臺從服務器。
數據安全:數據是從主服務器複製到從服務器的,而且從服務器可以隨時暫停複製,這樣我們就實現數據備份與還原。
遠程數據分享:如果企業擁有多處位於其他地理位置的分公司,而這些分公司希望共享總部的數據庫資源,就可以使用複製實現數據的共享,而且分公司不必時時連接主服務器,可以僅在需要時進行復制。
MySQL複製有兩種核心的格式,一種是基於SQL語句的複製(SBR:Statement Based Replication),另一種是基於行的複製(RBR:Row BasedReplication),另外有時也可以使用混合模式複製。MySQL 5.6默認採用的是基於語句的複製。
MySQL服務器之間的複製是基於二進制日誌機制。在主服務器上當MySQL實例進行寫操作時會同時生成一條操作事件日誌並寫入二進制日誌文件中,而從服務器則負責讀取主服務器上的二進制日誌,並在從服務器本機重新執行該事件,從而實現複製數據至本地服務器。當主服務器開啓了二進制日誌功能後,所有的SQL語句都將被記錄至日誌。而從服務器複製這些二進制日誌的條目,並且根據自己的需要決定哪些語句需要重新在從服務器執行,而哪些語句不需要再執行。我們無法控制主服務器僅記錄特定語句到日誌文件。如果沒有進行其他設置,所有主服務器中的日誌事件都將在從服務器上重新執行,當然你可以配置從服務器僅執行主服務器中的一部分日誌事件。因爲從服務器會記錄二進制日誌的進度與位置(比如執行到了第幾條語句),所以從服務器可以斷開與主服務器之間的連接,並在重新建立連接後繼續進行復制工作。
在具體操作過程中,主服務器與從服務器都需要配置一個唯一的ID編號。另外,所有的從服務器還必須設置主服務器的主機名、日誌文件名、文件位置等參數。
本節我們將演示如何一步一步實現MySQL服務器之間的數據複製(演示環步驟中命令提示符爲master則代表指令在MySQL主服務器上運行,提示符爲slave1則代表指令在MySQL從服務器上運行)。整個過程一般分爲以下幾個步驟:
在主服務器上開啓二進制日誌功能,設置唯一的服務器ID編號。這些設置需要重啓MySQL服務。
在所有從服務器上設置唯一的服務器ID編號,這些設置需要重啓MySQL服務。
在主服務器上爲不用的從服務器創建可以讀取主服務器日誌文件的賬戶,或使用相同的統一賬戶。
在進行數據複製之前,你還需要記錄主服務器上二進制日誌的位置標記。
3.數據複製環境之主服務器設置
在實際的生產環境中,可能在我們還沒有部署數據複製前,數據庫中就已經存在大量數據,所以,這裏我們事先創建一個測試用數據庫及數據表,用來演示如何對已經存在的數據進行數據同步備份。
[root@master ~]# mysql -u root -p mysql> create database hr; mysql> use hr; mysql> create table employees( -> employee_id INT NOT NULL AUTO_INCREMENT, -> name char(20) NOT NULL, -> e_mail varchar(50), -> PRIMARY KEY(employee_id)); mysql> INSERT INTO employees values ->(1,'TOM','[email protected]'), ->(2,'Jerry','[email protected]'); mysql> exit
我們需要在主服務器上開啓二進制日誌並設置服務器編號,服務器唯一編號必須是1至232-1之間的整數,根據自己的實際情況進行設置。進行這些設置需要關閉MySQL數據庫並編輯my.cnf或my.ini文件,並在[mysqld]設置段添加相應的配置選項。關於MySQL軟件的安裝這裏不再贅述,請參考4.11.2章節內容。
[root@master ~]# vim /etc/my.cnf
[mysqld] log-bin=Jacob-bin#啓用二進制日誌,並設置二進制日誌文件前綴 server-id=254#設置服務器編號 |
[root@master ~]# service mysqld restart
[root@master ~]# service iptables stop
l注意:在配置文件中不可以使用skip-networking參數選項,否則從服務器將無法與主服務器進行連接並複製數據。 |
4.數據複製環境之從服務器設置
如果從服務器ID編號沒有設置,或服務器ID編號與主服務器有衝突,就必須關閉MySQL服務並重新編輯配置文件,設置唯一的服務器編號,最後重啓MySQL服務。如果有多臺從服務器,則所有的服務器ID編號都必須是唯一的。可以考慮將服務器ID編號與服務器IP地址關聯,這樣ID編號同時可以唯一標識一臺服務器計算機,如採用IP地址的最後一位作爲MySQL服務器ID編號。
[root@slave1 ~]# vim /etc/my.cnf
[mysqld] server-id=2 |
[root@slave1 ~]# service mysqld restart
[root@slave1 ~]# service iptables stop
對於複製而言,MySQL從服務器上二進制日誌功能是不需要開啓的。但是,你也可以通過啓用從服務器的二進制日誌功能,實現數據備份與恢復,此外在一些更復雜的拓撲環境中,MySQL從服務器也可以扮演其他從服務器的主服務器。
5.創建複製帳號
執行數據複製時,所有的從服務器都需要使用賬戶與密碼連接MySQL主服務器,所以在主服務器上必須存在至少一個用戶賬戶及相應密碼供從服務器連接。這個賬戶必須擁有REPLICATION SLAVE權限,你可以爲不同的從服務器創建不同的賬戶與密碼,也可以使用統一的賬戶與密碼。MySQL可以使用CREATE USER語句創建用戶,使用GRANT語句爲賬戶賦權。如果該用戶僅爲數據庫複製所使用,則該賬戶僅需要REPLICATION SLAVE權限即可。下面的例子將在MySQL主服務器上創建一個擁有複製權限的slave_cp賬戶,該賬戶可以從example.com域內的任何主機連接主服務器,密碼爲SlaveAdmin。
[root@master ~]# mysql -u root -p mysql> CREATE USER 'slave_cp'@'%.example.com' IDENTIFIED BY 'SlaveAdmin'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_cp'@'%.example.com'; mysql> exit
6.獲取主服務器二進制日誌信息
在進行主從數據複製之前我們瞭解一些主服務器的二進制日誌文件的基本信息,這些信息在對從服務器的設置中需要用到,這些信息包括主服務器二進制文件名稱及當前日誌記錄位置,這樣從服務器就可以知道從哪裏開始進行復制操作。我們可以使用如下操作查看主服務器二進制日誌數據信息:
[root@master ~]# mysql -u root -p mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; +--------------------------------+------------+---------------------+-------------------------+--------------------------+ | File|Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +--------------------------------+------------+---------------------+-------------------------+--------------------------+ | jacob-log.000001|1276|||| +--------------------------------+------------+---------------------+--------------------------+-------------------------+ mysql> UNLOCK TABLES;
其中,File列顯示的是二進制日誌文件名,Position爲當前日誌記錄位置。
FLUSH TABLES WITH READ LOCK命令的作用是對所有數據庫的所有表執行只讀鎖定,只讀鎖定後所有數據庫的寫操作將被拒絕,但讀操作可以繼續。執行鎖定可以防止在查看二進制日誌信息的同時有人對數據進行修改操作,最後使用UNLOCK TABLES語句對全局鎖執行結束操作。
7.對現有數據庫進行快照備份
如果在使用二進制日誌進行數據複製以前,MySQL數據庫系統中已經存在大量數據資源,對這些資料進行數據備份的一種方法使用使用mysqldump工具,在主服務器上使用該工具對數據備份後即可在從服務器上進行數據還原操作。當希望的數據達到主從一致後,就可以使用數據複製功能進行自動從此同步操作。具體操作如下(作者的環境中主服務器IP地址爲172.16.0.254,從服務器IP地址爲172.16.0.1),實際生產環境中需要根據自己的需要有選擇的對數據庫進行備份與還原:
[root@master ~]# mysqldump --all-databases --lock-all-tables > /tmp/dbdump.sql [root@master ~]# scp /tmp/dbdump.sql 172.16.0.1:/tmp/ [root@slave1 ~]# mysql -u root -p <dbdump.sql
8.配置從服務器連接主服務器進行數據複製
數據複製的關鍵操作是配置從服務器去連接主服務器進行數據複製,我們需要告知從服務器建立網絡連接所有必要的信息。使用CHANGE MASTER TO語句即可完成該項工作,MASTER_HOST指定主服務器主機名或IP地址,MASTER_USER爲主服務器上創建的擁有複製權限的賬戶名稱,MASTER_PASSWORD爲該賬戶的密碼,MASTER_LOG_FILE指定主服務器二進制日誌文件名稱,MASTER_LOG_POS爲主服務器二進制日誌當前記錄的位置。START SLAVE開啓從服務器功能進行主從連接,SHOW SLAVE STATUS查看從服務器狀態。
[root@slave1 ~]# mysql -u root -p mysql> CHANGE MASTER TO -> MASTER_HOST='172.16.0.155', -> MASTER_USER='data_cp', -> MASTER_PASSWORD='SlaveAdmin', -> MASTER_LOG_FILE='jacob-log.000001', -> MASTER_LOG_POS=1351; mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G;
9.數據同步驗證
所有主從均設置完畢後,我們可以通過在主服務上創建新的數據資料,然後在從服務器上查看,所有數據將自動同步。
[root@master ~]# mysql -u root -p mysql> create database test2; mysql> use test2; mysql> create table t_table( ->name char(20), -> age int, -> note varchar(50)); mysql> INSERT INTO t_table values -> ('linda',23, 'Beijing'), -> ('jerry',33, 'shanghai'),; mysql> exit [root@slave1 ~]# mysql -u root -p mysql> select * from test2.t_table; mysql> exit