以前有遇到過主從數據庫由於SQL語句問題致使同步報錯,那若是同步中斷以後,從哪裏開始恢復呢?mysql
咱們首先再來回顧一下主從同步的過程,手機碼字不易,因此先copy一段。sql
1、主從原理數據庫
Replication 線程數組
Mysql的 Replication 是一個異步的複製過程,從一個 Mysql instace(咱們稱之爲 Master)複製到另外一個 Mysql instance(咱們稱之 Slave)。在Master 與 Slave 之間的實現整個複製過程主要由三個線程來完成,其中兩個線程(Sql線程和IO線程)在 Slave 端,另一個線程(IO線程)在 Master 端。緩存
要實現 MySQL 的Replication ,首先必須打開 Master 端的服務器
Binary Log(mysql-bin.xxxxxx)功能,不然沒法實現。由於整個複製過程實際上就是Slave從Master端獲取該日誌而後再在本身身上徹底 順序的執行日誌中所記錄的各類操做。打開 MySQL 的 Binary Log 能夠經過在啓動 MySQL Server 的過程當中使用 「—log-bin」 參數選項,或者在 my.cnf 配置文件中的 mysqld 參數組([mysqld]標識後的參數部分)增長 「log-bin」 參數項。異步
複製的基本過程以下 :線程
1. Slave 上面的IO線程鏈接上 Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)以後的日誌內容;日誌
2. Master 接收到來自 Slave 的 IO 線程的請求後,經過負責複製的 IO 線程根據請求信息讀取指定日誌指定位置以後的日誌信息,返回給 Slave 端的 IO 線程。返回信息中除了日誌所包含的信息以外,還包括本次返回的信息在 Master 端的 Binary Log 文件的名稱以及在 Binary Log 中的位置;同步
3. Slave 的 IO 線程接收到信息後,將接收到的日誌內容依次寫入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,並將讀取到的Master端的bin-log的文件名和位置記錄到master- info文件中,以便在下一次讀取的時候可以清楚的高速Master「我須要從某個bin-log的哪一個位置開始日後的日誌內容,請發給我」
4. Slave 的 SQL 線程檢測到 Relay Log 中新增長了內容後,會立刻解析該 Log 文件中的內容成爲在 Master 端真實執行時候的那些可執行的 Query 語句,並在自身執行這些 Query。這樣,實際上就是在 Master 端和 Slave 端執行了一樣的 Query,因此兩端的數據是徹底同樣的。
簡單來說就是從庫先經過io線程讀取主庫的二進制文件(Master_Log_File)和位置(Read_Master_Log_Pos)而後緩存到本地(從庫服務器)的中繼文件(Relay_Log_File)中並記錄已經讀取到的位置(Relay_Log_Pos),再經過從庫的sql線程去讀取中繼文件(Relay_Log_File),這個sql線程執行會記錄已經執行到了哪一個文件(Relay_Master_Log_File)和哪一個位置(Exec_Master_Log_Pos)。
從這裏咱們知道,有一個Read_Master_Log_Pos 記錄了最後一次同步的截止點,而後寫入到master-info文件中,這樣咱們下次同步的時候,就能夠從這個位置開始同步了。