binlog入門解讀
- 2019 年 11 月 21 日
- 筆記
我們在使用和維護mysql時,一定經常聽到binlog這個概念。binlog在主從複製,數據恢復等場景都有著重要作用。本篇文章主要介紹binlog的概念,功能及常用操作,旨在幫助大家對binlog有更深的了解。
基本概念
binlog是一個二進位格式的文件,記錄所有對資料庫表結構產生變更的操作(insert,update,delete,create,alter…)。binlog文件存放在/var/log/mysql/
目錄下,包括兩類文件,索引文件mysql-bin.index和日誌文件mysql-bin.00000x。索引文件記錄所有的binlog日誌文件,日誌文件則記錄sql語句。
binlog主要用途
數據恢復:可用於回檔或故障遷移恢復。比如騰訊雲資料庫mysql的回檔功能基於冷備數據+binlog實現,可以將雲資料庫或表回檔到指定時間。
主從複製:mysql通過主從複製保持所有主從節點的數據一致性,這個過程依賴於binlog的傳輸回放等。具體流程在下面有詳細介紹。
數據審計:通過binlog記錄的sql語句,可用來審計追蹤用戶操作
記錄模式
binlog共有3種記錄模式:statement,row,mixed.
statement:基於 SQL 語句的複製。
優點:binlog日誌量佔用小,節約了IO,提高性能。
缺點:記錄的只是執行語句,為了這些語句能在slave上正確運行,還需要記錄每條語句在執行的時候的一些相關資訊,以保證所有語句能在slave得到和在master端執行時候相同 的結果。例如UUID,NOW等函數在複製過程可能導致數據不一致甚至出錯。
row:基於行的複製,記錄每行實際數據的變更。
優點:複製過程準確,不會出現某些特定情況下的存儲過程,或function,以及trigger的調用和觸發無法被正確複製的問題。
缺點:binlog 的磁碟佔用會比其他兩種模式大很多,在一些大表中清除大量數據時在 binlog 中會生成很多條語句,可能導致從庫延遲變大。
mixed:在該模式下,MySQL會根據執行的每一條具體的sql語句來靈活選擇記錄格式。一般的語句修改使用statment格式來提高性能,在遇到一些statement無法完成主從複製的操作時,則採用row格式保存binlog。
優點:綜合其他兩種模式的特點,準確性強,文件大小適中。
缺點:可能導致主從不一致。
mysql主從複製
為保證高可用(High Availability),目前mysql多採用主從(master-slave)架構,一個主節點加若干從節點。主從架構不僅可以進行讀寫分離,還可以在主節點宕機時快速拉起一個從節點充當主節點,恢復高可用。mysql通過主從複製保證數據在所有節點中的一致性。
主從複製原理
mysql主從複製涉及到三個執行緒,一個運行在主節點(log dump thread),其餘兩個(I/O thread, SQL thread)運行在從節點。
首先,當從節點連接主節點時,主節點會為每一個從節點創建一個log dump 執行緒,用於發送binlog. 每個從節點會創建一個I/O執行緒用來請求接收主節點上的binlog。成功接收到的更新會被I/O執行緒保存在本地的relay log中。從節點上的SQL執行緒負責讀取relay log中的內容,解析成具體的操作在本地執行,完成整個複製過程。過程的原理圖如下圖所示。

主從複製模式
mysql主從複製有3種模式
1. 非同步複製
非同步複製如下圖所示,這種模式下主節點將所有更新寫入binlog文件之後就返回客戶端結果,而不會主動push binlog到從節點。一旦主節點宕機,從節點會因為沒有同步到最新binlog導致數據丟失。相對地,該模式處理效率更高,響應速度快。mysql 主從複製默認是非同步模式。

2. 半同步複製
半同步複製如下圖所示,這種模式下主節點在本地寫入binlog後,會主動推送binlog到從節點。在接收到其中一台從節點的返回資訊後,再返回給客戶端,否則需要等待直到超時時間然後切換成非同步模式再提交。相比非同步複製,提高了數據安全性,也降低了主從延遲。但性能上會有一定的降低,響應時間會變長。
半同步模式不是mysql內置的,從mysql 5.5開始集成,需要主從節點安裝插件開啟半同步模式。

3. 全同步複製
全同步複製是指主節點和全部從節點都執行了commit並確認才會向客戶端返回成功。在犧牲了效率的前提下,保證了數據的強一致性。
binlog相關操作
1. 查看是否開啟binlog,默認都是開啟的,除非手動關閉了
show variables like 'log_bin';

2. 查看當前使用的binlog_format
show variables like 'binlog_format';

3. 修改binlog_format(騰訊雲資料庫不支援修改這個參數,默認為row)
set globle binlog_format='MIXED';

4.查看當前主庫正在寫入的binlog文件位置
show master statusG;

5. 查看指定binlog文件的內容
show binlog events in 'mysql-bin.00000x';

6. 獲取binlog文件列表
show binary logs;

7. 查看binlog文件的大小限制,騰訊雲mysql實例中,binlog文件默認大小是256MB。一旦超過就會自動新建一個binlog。
show variables like '%max_binlog%';

8. 手動刷新binlog文件,生成新的binlog文件。注意,伺服器在重啟時,也會調用flush logs操作。所以重啟伺服器也會自動生成新的binlog文件。
flush logs;

9. 刪除所有binlog,從001文件開始重新記錄(謹慎操作!)
reset master;
