1. 程式人生 > >mysql資料庫的複製詳解

mysql資料庫的複製詳解

1.mysql的二進位制日誌檔案

MySQL的二進位制日誌(binary log)是一個二進位制檔案,主要用於記錄修改資料或有可能引起資料變更的MySQL語句。二進位制日誌(binary log)中記錄了對MySQL資料庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、操作資料等其它額外資訊,但是它不記錄SELECT、SHOW等那些不修改資料的SQL語句。二進位制日誌(binary log)主要用於資料庫恢復和主從複製,以及審計(audit)操作。

2.複製解決的問題

    1)改變資料的分佈,將其遷移到不同的資料中心或者伺服器

    2)進行負載均衡,複製可以將讀操作分佈到多個伺服器上,實現對密集型應用的優化

    3)備份,可以通過複製的方式來備份資料

    4)高可用性和故障切換,複製能夠幫助應用程式避免Mysql單點失敗,一個包含複製的設計良好的故障切換系統能夠顯著的縮短宕機時間。

3.複製工作如何工作

1)在主庫上把資料更改記錄(就是會改變資料的sql)記錄到到二進位制日誌檔案中,這些記錄被稱為二進位制日誌事件(這個記錄順序是按照事務的提交順序來記錄的而不是每條語句的執行順序來記錄的)

2)備庫將主庫上的日誌複製到自己的中繼日誌中

3)備庫讀取中繼日誌中的事件,將其放到備庫資料之上

備庫將主庫的二進位制日誌複製到其本地的中繼日誌中,首先,備庫會啟動一個工作執行緒,稱為I/O執行緒。I/O執行緒會跟主庫建立一個普通的客戶端連線,然後在主庫上啟動一個二進位制轉儲執行緒,他會讀取主庫上二進位制日誌中的事件,他不會對事件進行輪詢。如果該執行緒追趕上了主庫那麼它進入休眠狀態,直到主庫傳送訊號量通知其有新的事件產生,這是就會被喚醒,備庫I/O執行緒會將接受到的事件記錄到中繼日誌中。

備庫的sql執行緒執行最後一步,該執行緒從中繼日誌中讀取事件並在備庫執行,從而實現備庫資料的更新。

其實可以這樣理解,就是主庫在對資料操作時會記錄下自己都幹了啥,寫在了日誌檔案中,備庫讀取該檔案到當前伺服器,然後重新執行一遍主庫資料庫執行的操作,如果執行到了現在主庫正在執行的日誌的地方,說明更新就完成了或者複製完了。在這個過程中有個好處就是獲取事件和重放事件解耦了,這兩者是非同步的過程,但是有個缺點就是在主庫上併發執行的查詢在備庫上只能序列化,因為只有一個sql執行緒來重放中間日誌中的事件。(主庫和備庫在剛開始是具有相同的資料的)

4.從另一個伺服器開始複製

前面我們所說的複製都是假設兩臺伺服器初始時的資料是完全一樣的,並且知道當前主庫的二進位制日誌。如果現在一臺伺服器還沒有資料,那麼複製就需要克隆資料到備庫上:

主庫複製資料,從另一臺備庫克隆資料,使用最近一次備份啟動備庫,需要三個條件來讓主庫和備庫保持同步:

1)在某個時間點的主庫的資料快照

2)主庫當前的二進位制日誌檔案,和獲得資料快照時在該二進位制日誌檔案中的偏移量,我們把這兩個值稱為日誌檔案座標,通過這兩個值可以定位二進位制文日誌的位置

3)從快照時間到現在的二進位制日誌

其它一些從別的伺服器克隆備庫的方法:

1)使用冷備份。關閉主庫,將資料複製到備庫,重啟主庫,使用新的二進位制日誌檔案。在備庫通過執行change master to指令指向新二進位制日誌檔案的起始處。

缺點,複製資料時要關閉主庫

2)熱備份。在不關閉主庫的情況下複製資料

3)使用mysqldump

4)使用快照或備份(需要知道生成快照後的二進位制日誌座標)

5)使用另外的備庫獲得備份

5.複製的原理

1)基於語句的複製

基於語句的複製:就是從庫(slave)基於產生變化的SQL語句從主庫(master)進行復制。在MySQL5.1.4版本之前是binlog和複製唯一支援的模式,也是MySQL5.5中預設的格式。

(就是記錄那些對資料造成更改的查詢,當備庫讀取並重放這些事件的時候,實際上就是把主庫上執行過的sql在執行一遍,省頻寬。基於語句的複製過程基本上就是執行sql語句,如果正在使用觸發器或者儲存過程中,就不要使用基於語句的複製模式

優點:

  • 久經考驗,或者說是很成熟的技術,從MySQL3.23版本已經開始支援。
  • 更少的資料需要寫入binlog檔案中;當update,insert或者delete影響很多行時,它會佔用很少的儲存空間,同樣也意味著當從備份中恢復會更快。

缺點:

  • sql語句沒法被正確複製,例如使用了current_user()函式的語句,儲存過程和觸發器在使用基於語句的複製模式時可能也存在問題。 
  • 更新是序列的。
  • 基於語句的複製的語句,資料是不安全的。不是所有可能修改資料的語句都可以通過基於語句的複製而進行安全,無誤差的複製。一些不確定的因素或者說行為導致很難通過基於語句進行復制

2)基於行的複製

基於行的複製:基於行的複製不復制SQL語句,而是將插入,刪除或更新操作的各行進行復制。master的binlog記錄的是各個表中行的變化。這種方式會將實際資料記錄在二進位制日誌檔案中

優點:

  •  任何情況都可以被複制,這對複製來說是最安全可靠的
  • 和其他大多數資料庫系統的複製技術一樣
  •  多數情況下,從伺服器上的表如果有主鍵的話,複製就會快了很多

缺點:

  • binlog 大了很多
  •  複雜的回滾時 binlog 中會包含大量的資料
  • 主伺服器上執行 UPDATE 語句時,所有發生變化的記錄都會寫到 binlog 中,而 SBR 只會寫一次,這會導致頻繁發生 binlog 的併發寫問題
  • 無法從 binlog 中看到都複製了些什麼語句