將主數據庫中的DDL和DML操做經過二進制日誌(BINLOG)傳輸到從數據庫上,而後將這些日誌從新執行(重作);從而使得從數據庫的數據與主數據庫保持一致。
html
一、主數據庫出現問題,能夠切換到從數據庫。mysql
二、能夠進行數據庫層面的讀寫分離,sql
三、能夠在從數據庫上進行平常備份數據庫
Binary log:主數據庫的二進制日誌windows
Relay log:從服務器的中繼日誌服務器
第一步:master在每一個事務更新數據完成以前,將該操做記錄串行地寫入到binlog文件中。網絡
第二步:salve開啓一個I/O Thread,該線程在master打開一個普通鏈接,主要工做是binlog dump process。若是讀取的進度已經跟上了master,就進入睡眠狀態並等待master產生新的事件。I/O線程最終的目的是將這些事件寫入到中繼日誌中。spa
第三步:SQL Thread會讀取中繼日誌,並順序執行該日誌中的SQL事件,從而與主數據庫中的數據保持一致。線程
我是在同一個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的鏡子同樣。
在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有新的事件產生。