redo log 與 binlog redo log redo log (重做日誌)是處於存儲引擎層的,是InnoDB引擎特有的 redo log 存儲的是物理日誌 即,“在某個數據頁上改動了什麼” redo log是迴圈寫,空間是一定的,會用完。 MySQL使用WAL技術 Write-Ahead- ...
redo log 與 binlog
redo log
-
redo log (重做日誌)是處於
存儲引擎層
的,是InnoDB引擎特有的 -
redo log 存儲的是物理日誌 --- 即,“在某個數據頁上改動了什麼”
-
redo log是迴圈寫,空間是一定的,會用完。
-
MySQL使用WAL技術 --- Write-Ahead-Logging,
具體到redo log就是:當有一條記錄需要更新的時候,InnoDB引擎會先先把記錄寫在redo log里並更新記憶體,然後在空閑的時候將操作記錄更新到磁碟里。
-
InnoDB 引擎的 redo log 的空間是有限的,一組4個文件,每個文件1GB,總共4GB。當這塊“臨時記錄板”寫滿後再次從開頭的地方迴圈寫入。
-
redo log 的寫入分為兩個步驟 ---
perpare
和commit
階段 --- ”兩階段提交“
有了redo log,就可以保證即使資料庫發生異常重啟也不會丟失記錄,稱為 crash-safe
binlog
-
binlog (歸檔日誌) 處於
server層
,是Mysql自帶的日誌模塊 -
binlog 是存儲的是邏輯日誌 --- 即,“記錄原始語句”。因此可用來恢複數據庫 --- 相當於在某個時間的基礎上重新運行了一遍相關語句。
-
binlog 是可追加寫入的 --- binlog文件寫到 一定大小後就會在下一個文件中繼續寫,而不覆蓋之前的文件。
兩種日誌的使用流程
- (執行器)讀取表中需要update的那一行
- (InnoDB)查詢該行信息是否在記憶體中。若沒有則從磁碟讀取到記憶體。然後都返回行數據
- (執行器)更改行數據、寫入新行
- (InnoDB)新行更新到記憶體,寫入redo log (此時處於prepare階段)
- (執行器)寫入binlog
- (InnoDB)提交事務 (此時處於commit階段)
使用“兩階段提交”是為了避免恢復時恢復出來的資料庫與原有狀態不一致的現象。
避免MySQL crash時數據丟失的設置
我們知道發生crash時丟失的肯定都是記憶體中的數據,通過以下設置進行持久化
innodb_flush_log_at_trx_commit = 1
--- 每次事務的 redo log 直接持久化到磁碟sync_binlog = 1
--- 每次事務的binlog都持久化到磁碟
恢復與擴容
- 最近的全量備份+到相應時間點的歸檔日誌(binlog)