mysql對binlog的處理說明

2022-10-06 02:06:07 字數 2279 閱讀 5359

然而這裡不打算對某種儲存引擎的實現細節進行描述,也不打算介紹各種儲存引擎的優缺點,只是描述一下mysql如何處理binlog,並澄清幾個容易混淆的問題。

binlog對mysql而言是重要的,主要體現在它的功能上。mysql官方文件明確指出,binlog的啟動大概會為mysql增加1%的負載,因此在絕大多數情況下,binlog都不會成為mysql的效能瓶頸。

binlog是mysql以二進位制形式列印的日誌,它預設不wrtrgrpl加密,不壓縮。每個正常的binlog檔案頭部,有4個位元組的標記,值為0xfe 0x62 0x69 0x6e。log_event是binlog裡的單位,即正常情況下binlog按照逐log_event的形式增長。除去頭部的標記,binlog就是乙個log_event的序列。每個log_event都獨立單元,沒有互相引用的關係,它也有自己的二進位制頭部,主要是記錄了時間戳、型別標記等描述資訊。

mysql把磁碟操作的實現封裝在io_cache結構裡,這也方便了我們對binlog的研究和描述,後文如果沒有特別說明,讀寫binlog與讀寫io_cache的含義相同。

為了解mysql寫入binlog的過程,可以找乙個sql語句的處理過程進行跟蹤。以update為例,在最簡單的情況下,mysql會先呼叫為儲存引擎開放的介面ha_update_row,然而執行binlog_query對binlog進行寫操作。這樣處理的原因是,在主從備份的場景下,如果主庫先寫入binlo程式設計客棧g成功、在執行update的過程中crash,從庫有可能執行update成功,此時主庫重啟之後,與從庫的資料不一致。如果update操作發生在事務性的表上,在寫入binlog之後會執行開放介面ha_autocommit_or_rollback,由儲存引擎判斷操作結果。

在主從備份的場景下,主庫相當於server,從庫相當於client,雙方採用tcp短連線。從庫發出讀取日誌的請求,主庫接收請求、讀取本地binlog、然後傳送給從庫。從庫接收日誌,進行簡單校驗後寫本地日誌,稱為relay log。此處從庫的流程專門由乙個執行緒負責,稱為同步io執行緒。從庫還有乙個執行緒,稱為同步sql執行緒。它的行為是,定期讀取relay log,解析並執行同步過來的sql語句。

下面回答幾個問題:

1. binlog的格式?

二進位制順序儲存,不加密,不壓縮

2.binlog使用wal嗎?

no 3.主庫傳送binlog,是使用記憶體裡的copy嗎?

無法確定,很有可能是先從磁碟上讀乙份,然後傳送。程式設計客棧

4. relaylog使用wal嗎?

yes。從庫接收到日誌後,會先寫relay log

5. binlog和relaylog的sql是否一致?

在網路傳輸正確性可靠的前提下,yes

提乙個問題:

既然binlog不使用wal,那麼在主從場景下,mysql異常之後,主庫和從庫是否會不一致呢?

之前有個問題一直沒弄明白:

既然mysql是先做資料操作、再寫binlog,如果寫binlog的時候失敗,mysql又crash,程式設計客棧資料怎麼辦?

答案是由儲存引擎決定資料。

可以把mysql和它的儲存引擎分開看,因為mysql只是乙個框架,而不是乙個實現。

binlog是mysql自己的日誌,而事務是由儲存引擎本身保證的。

以update為例,mysql做的事情簡單分為:

1. 修改資料update

2. 寫binlog

3. 如果當前處理的表是乙個事務性的表,則commit或rollback

注意此處的update和commit/rollback都由儲存引擎實現,mysql只是站在邏輯的高度上理解這些操作。

對於事務型的引擎innodb,它本身有日誌保證資料的一致性。在innodb的實現中,update修改資料之前,

會新建乙個事務,並建立乙個回滾點。而在innodb提供的commit/rollback介面會提交/回滾事務。

因此對innodb而言,每條sql語句的事務,其實包含了binlog的寫操作。然而即使是這樣,innodb仍然無法保證

binlog和資料的程式設計客棧一致性,因為innodb在寫commit成功後crash,回滾操作不會回滾binlog。按照手冊上的說法,

把--innodb-support-xa設定為1,同時保證sync_binlog=1,才能保證innodb的binlog和資料一致。

對於非事務型的引擎myisam,沒有commit/rollback的機會,因此在異常情況下,資料會和binlog不一致。

那麼新的問題出現了:myisam如何處理這個不一致呢?

本文標題: mysql對binlog的處理說明

本文位址:

MySQL 歷史 binlog 日誌處理

目錄 一 問題的引出 mysql binlog 如果不清理會占用伺服器的空間,那麼怎麼處理binlog日誌呢 二 解決辦法 1 物理刪除 bob bob pc df th 檔案系統 型別 容量 已用 可用 已用 掛載點 udev devtmpfs 7.8g 0 7.8g 0 dev tmpfs tm...

MySQL資料的binlog處理方法 日誌定時清理

最近磁碟增長的非常快,發現binlog日誌占用很大的磁碟資源。我們採用手動清理,後面設定一下自動清理。檢視指定刪除日誌 mysql show binary logs 檢視多少binlog日誌,占用多少空間。mysql purge master logs to mysql bin.002467 刪除m...

刪除mysql的binlog日誌

mysql的binlog日誌介紹 binlog 是mysql 以二進位制形式列印的日誌,它預設不加密,不壓縮。binlog二進位制日誌包含了所有更新了資料或者已經潛在更新了資料 例如,沒有匹配任何行的乙個delete 的所有語句。語句以 事件 的形式儲存,它描述資料更改檔案位置和格式 當用 log ...