MySQL主從復制
1、數據庫主從復制的基本介紹
數據庫中的主從復制就是將主數據庫中的 DDL 和 DML 操作通過二進制日志傳輸到從數據庫上,然后將這些日志重新執行(重做),從而使得從數據庫的數據與主數據庫保持一致。
MySQL支持單向、異步復制,復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。
MySQL復制是基于主服務器在二進制日志中跟蹤所有對數據庫的更改。因此,要進行復制,必須在主服務器上啟用二進制日志。每個從服務器從主服務器接收主服務器已經記錄到日志的數據。
當一個從服務器連接主服務器時,它通知主服務器從服務器在日志中讀取的最后一次成功更新的位置。從服務器接收從那時起發生的任何更新,并在本機上執行相同的更新。然后封鎖并等待主服務器通知新的更新。從服務器執行備份不會干擾主服務器,在備份過程中主服務器可以繼續處理更新。
MySQL復制是異步的且串行化的。主節點中一個用戶請求一個寫操作時,主節點并不需要等待從服務器也將這些寫入操作執行完成后再響應用戶,而是只要主節點把寫入操作完成后就響應用戶,因此從節點中的數據有可能會落后主節點。
1.1、主從復制的作用
主從復制的作用有以下:
- 主數據庫出現問題,可以切換到從數據庫。
- 可以進行數據庫層面的讀寫分離。
- 可以在從數據庫上進行日常備份。
2、MySQL主從復制的過程

主要有以下三步:
第一步:master 在每個事務更新數據完成之前,將該操作記錄串行地寫入到 binlog 文件中。master 將數據改變的記錄到二進制日志(binary log),這個記錄的過程叫做二進制日志事件(binary log events)。
第二步:slave開啟一個I/O Thread,該線程在master打開一個普通連接,主要工作是將 master 的 binlog 拷貝到它的中繼日志(relay log) 中。如果讀取的進度已經跟上了master,就進入睡眠狀態并等待master產生新的事件。
第三步:SQL Thread 會讀取中繼日志,并順序執行該日志中的 SQL 事件,從而保持與主數據庫中的數據一致。MySQL復制是異步的且串行化的。
(Binary log:主數據庫的二進制日志。Relay log:從服務器的中繼日志)
主從復制的原則主要有:
- 每個slave只有一個master
- 每個slave只能有一個唯一的服務器ID
- 每個master可以有多個salve
3、MySQL主從復制配置示例
注意:主機和從機的 mysql 版本盡量要保持一致。
首先準備兩臺服務器,如主數據庫:192.168.32.130,從數據庫:192.168.32.131。
修改兩臺服務器的數據庫配置,如下:
修改配置文件:
vim /etc/my.cnf
主服務器修改:
主要就是在 [mysqld] 下面添加:
log-bin=mysql-bin server_id=1
上面的配置在配置文件中可能本身已經有了,這樣就不用修改也行。如下:

server-id 的值不一定要是 1,也可以設置其他值,但不要和從服務器的相同。
從機的配置跟主機也一樣,同樣只是修改 log-bin 和 server_id,如下示例:

修改完之后記得要重啟數據庫:service mysql restart 才能生效。
可以通過 show variables like 'ser%'; 命令來查看 server_id 的值,如下:

然后在主服務器上為從服務器分配一個賬號并授權,這樣從服務器才能到主服務器上獲取共享主服務器的日志文件。
GRANT REPLICATION SLAVE ON *.* TO '備份賬號'@'從機數據庫的IP' IDENTIFIED BY '密碼'; -- 示例 GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'192.168.32.131' IDENTIFIED BY '123456';

查看主服務器的BIN日志信息,執行完后需記錄下 File 和 Position 的值,在配置完從服務器之前不要做主服務器上做任何操作,因為每次操作服務器的這兩個值都會發生變化。
show master status;

最后設置從服務器。
如果之前有設置過主從復制的話則先關閉 slave,執行以下命令:
stop slave;
執行以下命令:
CHANGE MASTER TO MASTER_HOST='主服務器IP',MASTER_USER='創建用戶名',MASTER_PASSWORD='創建的密碼', MASTER_LOG_FILE='File 名字',MASTER_LOG_POS=Position 數字; -- 示例 CHANGE MASTER TO MASTER_HOST='192.168.32.130',MASTER_USER='zhangsan',MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=266;

最后啟動從服務器復制功能
start slave;
可以查看從服務器狀態,如果下面的 Slave_IO_Running 和 Slave_SQL_Running 的值都為YES,說明配置成功。不成功的話,重復上述步驟。
show slave status\G;

由此,主從復制就配置完成了。
我們可以在主機上進行一系列的 SQL 操作,從機上會自動同步這些操作,保持主從數據庫一致。比如創建數據庫、新建表、增刪改查等等,都會自動同步到從數據庫中。
但是需注意,主從復制功能只是說會同步那些在配置完主從復制后的操作,在這之前的主服務器的表、視圖、數據庫等都不會因為配置了主從復制而隨之自動同步到從數據庫中。
可以通過以下命令停止從數據庫的復制功能,在從數據庫中執行以下命令:
stop slave;


浙公網安備 33010602011771號