MySQL主從複製的實現過程

1、什麼是主從複製

將主數據庫中的DDL和DML操做經過二進制日誌(BINLOG)傳輸到從數據庫上,而後將這些日誌從新執行(重作);從而使得從數據庫的數據與主數據庫保持一致。
html

2、主從複製的做用

一、主數據庫出現問題,能夠切換到從數據庫。mysql

二、能夠進行數據庫層面的讀寫分離,sql

三、能夠在從數據庫上進行平常備份數據庫

3、複製過程

 

Binary log:主數據庫的二進制日誌windows

Relay log:從服務器的中繼日誌服務器

第一步:master在每一個事務更新數據完成以前,將該操做記錄串行地寫入到binlog文件中。網絡

第二步:salve開啓一個I/O Thread,該線程在master打開一個普通鏈接,主要工做是binlog dump process。若是讀取的進度已經跟上了master,就進入睡眠狀態並等待master產生新的事件。I/O線程最終的目的是將這些事件寫入到中繼日誌中。spa

第三步:SQL Thread會讀取中繼日誌,並順序執行該日誌中的SQL事件,從而與主數據庫中的數據保持一致。線程

4、主從複製的具體操做

我是在同一個windows上不一樣的路徑下安裝兩個msyql實例。建議這裏主從兩個mysql的安裝版本一致,儘管我本身的是不一致的。3d

    

 

一、分別修改主從數據庫的配置文件my.ini

master

3306是mysql默認端口號,這裏master實例中能夠不用修改;server-id用來指定惟一id,不一樣的mysql實例不重複便可;binlog-do-db指定須要複製的數據庫;log-bin用來開啓二進制日誌文件。

salve

因爲主從數據庫待會都是在通一臺電腦上運行,因此端口須要設置成不同,這裏是3307

replicate-do-db:須要同步的數據庫名稱,與master上的配置保持一致。

二、在master上建立一個專門用於複製的帳戶:weidai/123456

這個新增的帳戶能夠在表mysql.user中進行查詢:

我第一次操做的時候,到這裏就完成了這個帳號的建立,可是到真正複製的時候,卻發現複製沒有成功,排查錯誤的時候發現master生成的binlong沒有問題,而後查看slave的狀態:

在結尾處有這樣一行錯誤:

使用weidai這個帳號沒法鏈接到master,因此應該是沒有獲取到master的binlog,致使中繼日誌沒法生成。

我反覆檢查了帳號和密碼都沒有發現問題,而後查找相關資料,才發現是由於在master建立新用戶的時候少了一步操做:

新設置用戶或更改密碼後需用flush privileges刷新MySQL的系統權限相關表,不然會出現拒絕訪問。這就是出現前面錯誤的緣由。另外還有一種辦法是從新啓動mysql服務器,來使新設置生效。

三、獲取主數據庫中此刻數據的位置,主要用於從數據啓動後,複製數據的起始位置,可是在獲取這個狀態值以前,主數據庫就不能再有數據的修改操做,因此須要先設置讀鎖定有效

四、主庫進行數據備份,備份的手段有不少種,這裏不展開介紹,能夠參考我上一篇文章,備份結束後能夠釋放讀鎖,主庫就能夠進行寫操做

五、啓動從數據庫,對剛纔備份的數據進行還原,這個時候主從數據庫在備份那個時間點的數據是一致的。

六、在從數據庫上進行復制行爲的相關配置

  

七、這個時候配置完成,可是從數據庫還不能進行同步,須要啓動slave線程

八、在master中建立表和新增數據,在slave中觀察:

能夠看出,我在master中進行的操做,都能在slave中體現出來,這個時候slave就如同是master的鏡子同樣。

5、主從同步狀態解讀

在slave上使用命令進行查看:

因爲排版太過於難看,我整理以下:

Slave_IO_STATE:Waiting for master to send event

Master_host:127.0.0.1

Master_user:weidai

Master_port:3306

connnect_retry:60

Master_log_file:mysql-bin.000005

Read_Master_log_pos:1662

Relay_log_file:AE6Z*****-relay-bin.000002

Relay_log_pos:1415

Slave_IO_Running:yes

Slave_SQL_Running:yes

----------------------------------------------------------華麗麗分割線-------------------------------------------

Slave_IO_Running:yes

Slave_SQL_Running:yes

這兩個線程前面有提到,是slave上參與複製過程當中兩個很重要的線程。YES表示正常,NO表示異常。

Slave_IO線程主要是將master上的binlong日誌內容複製到slave的中繼日誌中(Relay_log),通常出現問題的機率不大, 出現問題大多數是由於權限或者網絡等問題,致使鏈接不上master。如同前面提到的那個錯誤。

Slave_SQL線程負責將中繼日誌中的SQL執行一遍,相對來講出錯的機率大些。若有人手動的在從庫中插入一些記錄,致使主從同步的時候出現主鍵衝突。

 

Slave_IO_STATE:Waiting for master to send event

這個狀態表示中繼日誌同步完成,等待master有新的事件產生。

相關文章
相關標籤/搜索