您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關mysql中redo log和binlog的區別有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
想跟大家聊聊關于 mysql 中的兩個小的知識點:redo log 和 binlog
。
redo log
:InnoDB 存儲引擎層方面的日志,所以如果你使用的存儲引擎不是 InnoDB 的話,那就根本談不上 redo log。
binlog
: MySQL Server 層記錄的日志,所以不管是用的什么存儲引擎,只要是 MySQL 都是會有 binlog 的存在,在做 MySQL 主從復制的時候,利用的就是 binlog。
接下來,我們就詳細來看看它們都分別做了啥?
為什么要有這個 redo log 日志文件呢?
這里,我們可以舉個例子,現在我們想對數據庫的數據進行修改操作,現在一條 update 語句過來,一般 update 操作都伴隨著查詢的操作,得先找到這條數據,然后再進行更新操作對吧。
如果數據量比較小還好,很快就能找到并且更新完畢,但是如果數據量比較大,里面有一億條數據,怎么辦?而且更新操作肯定是要寫到磁盤上去的,那這中間的 IO 成本呢?
如果我有好幾十條 update 語句先后更新呢?這樣想的話,你就能想到,就這些操作,成本就高的不行,那能不能降低一下這些成本呢?
這時候,redo log 就起到作用了。 當有一條記錄更新的時候, InnoDB 引擎就會先把記錄寫到 redo log 里面去,同時更新內存,這樣就算是更新這條數據成功了。
但是此時,它并沒有更新到磁盤上去對吧?別擔心, InnoDB 會在恰當的時候,把這條及記錄更新到磁盤上去。
這樣的思想或者技術,有個專有名詞: WAL 技術,也就是 WriteAheadLogging ,核心就是先寫日志,再寫磁盤。
redo log 不能一直寫吧?
redo log 的大小是固定的,前面的內容會被覆蓋,一旦寫滿,就會觸發 redo log 到磁盤的同步,以便騰出空間記錄后面的修改。
數據庫發生宕機或者重啟,數據也將不會丟失。
因為有了 redo log ,之前提交的記錄都還在,只需要根據 redo log 里面的記錄進行相應恢復就可以了。
binlog 是 MySQL Server 層的記錄日志。
redo log 和 binlog 的區別:
redo log 是 InnoDB 引擎特有的; binlog 是 MySQL 的 Server 層實現的,所有的引擎都是可以的。
redo log 是物理日志,記錄的是”在 XXX 頁上做了 XXX 修改”;binlog 是邏輯日志,比如” 給 id = 2 這一行的 c 字段加 1”。
redo log 是有固定大小的,所以它的空間會用完,如果用完的話,一定要進行一些寫入磁盤的操作才可以繼續;binlog 是可以追加寫入的,也就是 binlog 沒有空間的概念,一直寫就行了。
binlog 以事件的形式記錄了所有的 DDL 和 DML 語句(因為它記錄的是操作而不是數據值,屬于邏輯日志),可以用來做主從復制和數據恢復。
在開啟了 binlog 功能的情況下,我們可以把 binlog 導出成 SQL 語句,把所有的操作重放一遍,來實現數據的恢復。
有了這兩個日志之后,我們來看一下一條更新語句是怎么執行的(redo 不能一次寫入了):
例如一條語句:update user set name='小馬' where id=1;
先查詢到這條數據,如果有緩存,也會用到緩存。
把 name 改成小馬
,然后調用引擎的 API 接口,寫入這一行數據到內存,同時記錄 redo log。這時 redo log 進入 prepare 狀態,然后告訴執行器,執行完成了,可以隨時提交。
執行器收到通知后記錄 binlog,然后調用存儲引擎接口,設置 redo log為 commit 狀態。
更新完成。
你能發現 redo log 竟然是先 prepare 狀態,等 binlog 寫完之后,才是 commit 狀態,這種方式就叫”兩階段提交”。為什么會有這種方式呢?
redo log 和 binlog 都可以用于表示事務的提交狀態,而兩階段提交
就是讓這兩個狀態保持邏輯上的一致。
可以假設一下,如果不采用這種方式,而是就先寫 redo log ,再寫 binlog ,會怎樣? 如果在寫 binlog 時,發生了異常,更新操作已經到 redo log 中了,但是此時 binlog 并沒有進行更新,是不是出現了數據不一致?
先寫 binlog 再寫 redo log 也是一樣的道理。所以,在寫時,先讓 redo log 處于 prepare 狀態,等 binlog 寫完之后,再讓 redo log 處于 commit 狀態,這樣就保持了邏輯上的一致。
感謝各位的閱讀!關于“mysql中redo log和binlog的區別有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。