為什麼有了binlog還要有redo log

2021-10-11 15:28:26 字數 1454 閱讀 1564

binlog會記錄所有與mysql資料庫有關的日誌記錄,包括innodb, myisam,heap等其他儲存引起的日誌。而redo log只記錄innodb引擎本身的日誌。

binlog記錄的是關於乙個事務的具體操作內容,即該日誌是邏輯日誌。而redolog記錄的是關於每個頁的更改的物理情況。

寫入時間不同。binlog僅在事務提交前提交,只寫磁碟一次,不論這個事務有多大。而redolog在事務進行過程中會不停的寫入。

它們分工是不同的。binlog用來做資料歸檔,但不具備崩潰恢復的能力,也就是說如果系統突然崩潰,重啟後可能會有部分資料丟失。

innodb將所有對頁面的修改操作寫入乙個專門的檔案,並在資料庫啟動時從此檔案進行恢復操作。

每個innodb引擎至少有1個重做日誌檔案組(group),每個檔案組下面至少有2個重做日誌檔案。為了提高可靠性,可以設定多個組,放到不同的磁碟中。在日誌組中每個重做日誌檔案大小一致,並以迴圈寫入的方式執行。先寫入檔案1,寫滿後寫入檔案2,2寫滿再切換到1.

寫入redolog不是直接寫磁碟,而是先寫入乙個重做日誌緩衝(redo log buffer),然後按一定的條件寫入。

所謂的條件:

主線程每秒重新整理

其實是基於配置的:

引數:innodb_flush_log_at_trx_commit

值:0、1、2 (0-表示事務提交的時候,不主動將事務的重做日誌寫入磁碟,而是等待主線程重新整理;1- 事務提交,將重做日誌刷入磁碟,並伴有fsync呼叫;2- 將重做日誌非同步寫入磁碟,即寫入到檔案系統的快取中。因此並不能完全保重寫入到磁碟)

為了保證事務的永續性,應該將innodb_flush_log_at_trx_commit設定為1。

其他影響redolog的引數

binnlog記錄資料庫執行更改的操作。預設關閉,需要手動開啟。

影響binlog的引數

判斷binlog_cache_size是否合適:

mysql> show global status like 'binlog_cache%'

binlog_cache_disk_use 0

binlog_cache_use 1

如上,binlog_cache_disk_use為0,使用臨時檔案次數為0,這個緩衝區夠大,不需要增加。

預設binlog不是每次寫的時候都同步磁碟(緩衝寫),當系統宕機時,可能會有一部分資料沒寫入binlog中。引數sync_binlog = [n] 表示寫入緩衝多少次就同步到磁碟。n=1表示同步寫。不會用到作業系統的緩衝。

如果將sync_binlog設定為1,在乙個事務發出commit之前,binlog被寫入磁碟,這時候宕機,事務沒有提交。下次啟動的時候,這個事務沒有提交,應該回滾,但是binlog被寫入磁碟了,就不能回滾。將innodb_support_xa設定為1可以解決這個問題。能確保binlog和redolog檔案的同步。

姜承堯·mysql技術內幕innodb儲存引擎·機械工業出版社

有了網段為什麼還要有VLAN???

近幾日,在學習vlan及vxlan方面的知識,對於產生原因做乙個總結及詳解。vlan virtual local area network,虛擬區域網 其主要用途是用來縮小廣播域,即進行隔離。先對廣播域的乙個概念做如下描繪 如下圖,主機a b c d均連線在交換機sw1上,其中a c同網段為192....

有了VARCHAR,為什麼還要有CHAR?

varchar varchar往往用來儲存可變長度的字串。簡單的說,我們只是給其固定了乙個最大值,然後系統會根據實際儲存的資料量來分配合適的儲存空間。為此相比char字元資料而言,其能夠比固定長度型別占用更少的儲存空間。因為其長度是可變的,為此在資料進行更新時可能會導致一些額外的工作。如在更改前,其...

為什麼有了foreach還要有迭代器?

foreach就是基於迭代器實現的 foreach需要知道自己的集合型別,甚至要知道自己集合內的元素型別,不能實現多型。這個使用的語法上都可以表示出來。foreach可以遍歷任何集合或者陣列,但是使用者需要知道遍歷元素的型別。iterator是乙個介面累心,它不關心集合的累心和集合內的元素型別,因為...