原文來(lái)自: 極客時(shí)間[mysql實(shí)戰(zhàn)45講] 第二講: 日志系統(tǒng): 一條SQL更新語(yǔ)句是如何執(zhí)行的.?
前言: select 語(yǔ)句的流程, update 語(yǔ)句也要走一遍. 不同的是, update流程還涉及日志模塊
一: redo log (重做日志)? ==> innodb引擎特有 ==> 引擎層
? ? 例子: 孔乙己
? ? 賬本:? ==> 磁盤(pán) ==> bin log
? ? 粉板:? ==> 內(nèi)存 ==> redo log
? ? 疑問(wèn)1: redo log 的讀寫(xiě)速度, 應(yīng)該介于磁盤(pán)和內(nèi)存之間, 同時(shí)又要持久話(huà), 那支持的硬件是什么呢??
? ? 賬本 + 粉板? ==> WAL ==> write? ahead Logging ==> 先寫(xiě)粉板, 在寫(xiě)磁盤(pán)
? ? ? ?what :? 是固定大小的, 可配置一組4個(gè)文件, 每個(gè)文件1GB , ==> 粉板總共4GB
? ? ? ? how: 從頭開(kāi)始寫(xiě), 寫(xiě)到末尾就回到開(kāi)頭循環(huán)寫(xiě).?
? ? ????? ? write pos : 當(dāng)前記錄的位置:? ?==> 一邊寫(xiě)一邊后移
? ? ????? ? checkpoint: 當(dāng)前要擦除的位置,? ==> 往后推移, 并且循環(huán).
? ? ????? ? 擦除: 寫(xiě)磁盤(pán)?
? ? ????? ? wp 和 cp 之間的是 "粉板" 上還空著的部分
? ? ????? ? wp 追上cp? 表示"粉板"已滿(mǎn) , ==> 停下來(lái)執(zhí)行擦除 , 把cp推進(jìn)?
? ?結(jié)論:? redo log 保證了 crash - safe 能力 ==> 異常重啟, 數(shù)據(jù)不丟失.?
二: binlog (歸檔日志) ==> mysql 共有 ==> server層
1. binlog? 和 redo? log? 的區(qū)別
? ? 1.redo log ==>? 物理日志, ==> 記錄在某個(gè)數(shù)據(jù)頁(yè)上做了什么修改.?? ?==> 循環(huán)寫(xiě)
? ? 2. binlog ==> ????邏輯日志 ????==> 語(yǔ)句的原始邏輯? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ==> 追加寫(xiě)
? ? 圖中: 淺色框 ==> innodb 內(nèi)部執(zhí)行
? ? ? ? ? ? ?深色框==> 執(zhí)行器 (server) 中執(zhí)行
三: 兩階段提交
疑問(wèn)2: 有沒(méi)有可能, binlog已經(jīng)寫(xiě)入, 但是 redo log commit 失敗了?? 最后兩步是原子操作嗎 ?
1.怎么恢復(fù)到半個(gè)月內(nèi)任意一秒?
? ? 1. 一定有定期整庫(kù)備份.??
? ? 2. 定期 ==> 取決于系統(tǒng)重要性. ==> 可以一周一備份, 也可以一天一備份.?
2.如果redo? log? 和 binlog 沒(méi)有用兩階段提交
疑問(wèn)3: redo log 還沒(méi)寫(xiě), 如果崩潰恢復(fù), 這個(gè)事務(wù)無(wú)效 ? ==>? redo log 的崩潰恢復(fù)能力, 和事務(wù)有關(guān)?? 如果事務(wù)提交, 會(huì)持久化到磁盤(pán)嗎?
答: 和事務(wù)有關(guān), 并且 redo? log 在事務(wù)提交后 ,會(huì)持久化.? ? 由參數(shù)控制