了解mysql三大日志-binlog魄藕、redo log和undo log

日志是 mysql 數據庫的重要組成部分内列,記錄著數據庫運行期間各種狀態(tài)信息。mysql日志主要包括錯誤日志背率、查詢日志话瞧、慢查詢日志、事務日志寝姿、二進制日志幾大類交排。作為開發(fā),我們重點需要關注的是二進制日志( binlog )和事務日志(包括redo log 和 undo log )饵筑,本文接下來會詳細介紹這三種日志埃篓。

binlog

binlog 用于記錄數據庫執(zhí)行的寫入性操作(不包括查詢)信息,以二進制的形式保存在磁盤中翻翩。binlog 是 mysql的邏輯日志都许,并且由 Server 層進行記錄,使用任何存儲引擎的 mysql 數據庫都會記錄 binlog 日志嫂冻。

  • 邏輯日志:可以簡單理解為記錄的就是sql語句 胶征。
  • 物理日志:mysql 數據最終是保存在數據頁中的,物理日志記錄的就是數據頁變更 桨仿。

binlog 是通過追加的方式進行寫入的睛低,可以通過max_binlog_size 參數設置每個 binlog文件的大小,當文件大小達到給定值之后服傍,會生成新的文件來保存日志钱雷。binlog使用場景在實際應用中, binlog 的主要使用場景有兩個吹零,分別是 主從復制 和 數據恢復 罩抗。

  1. 主從復制 :在 Master 端開啟 binlog ,然后將 binlog發(fā)送到各個 Slave 端灿椅, Slave 端重放 binlog 從而達到主從數據一致套蒂。
  2. 數據恢復 :通過使用 mysqlbinlog 工具來恢復數據。

binlog刷盤時機

對于 InnoDB 存儲引擎而言茫蛹,只有在事務提交時才會記錄biglog 操刀,此時記錄還在內存中,那么 biglog是什么時候刷到磁盤中的呢婴洼?

mysql 通過 sync_binlog 參數控制 biglog 的刷盤時機骨坑,取值范圍是 0-N:

  • 0:不去強制要求,由系統(tǒng)自行判斷何時寫入磁盤柬采;
  • 1:每次 commit 的時候都要將 binlog 寫入磁盤欢唾;
  • N:每N個事務且警,才會將 binlog 寫入磁盤。

從上面可以看出礁遣, sync_binlog 最安全的是設置是 1 振湾,這也是MySQL 5.7.7之后版本的默認值。但是設置一個大一些的值可以提升數據庫性能亡脸,因此實際情況下也可以將值適當調大,犧牲一定的一致性來獲取更好的性能树酪。binlog日志格式binlog 日志有三種格式浅碾,分別為 STATMENT 、 ROW 和 MIXED续语。

在 MySQL 5.7.7 之前垂谢,默認的格式是 STATEMENT , MySQL 5.7.7 之后疮茄,默認值是 ROW滥朱。日志格式通過 binlog-format 指定。

  • STATMENT:基于SQL 語句的復制( statement-based replication, SBR )力试,每一條會修改數據的sql語句會記錄到binlog 中 徙邻。

  • 優(yōu)點:不需要記錄每一行的變化,減少了 binlog 日志量畸裳,節(jié)約了 IO , 從而提高了性能缰犁;

  • 缺點:在某些情況下會導致主從數據不一致,比如執(zhí)行sysdate() 怖糊、 slepp() 等 帅容。

  • ROW:基于行的復制(row-based replication, RBR ),不記錄每條sql語句的上下文信息伍伤,僅需記錄哪條數據被修改了 并徘。

  • 優(yōu)點:不會出現某些特定情況下的存儲過程、或function扰魂、或trigger的調用和觸發(fā)無法被正確復制的問題 麦乞;

  • 缺點:會產生大量的日志,尤其是alter table 的時候會讓日志暴漲

  • MIXED:基于STATMENT 和 ROW 兩種模式的混合復制(mixed-based replication, MBR )阅爽,一般的復制使用STATEMENT 模式保存 binlog 路幸,對于 STATEMENT 模式無法復制的操作使用 ROW 模式保存 binlog

redo log

為什么需要redo log我們都知道,事務的四大特性里面有一個是 持久性 付翁,具體來說就是只要事務提交成功简肴,那么對數據庫做的修改就被永久保存下來了,不可能因為任何原因再回到原來的狀態(tài) 百侧。 那么 mysql是如何保證一致性的呢砰识?最簡單的做法是在每次事務提交的時候能扒,將該事務涉及修改的數據頁全部刷新到磁盤中。但是這么做會有嚴重的性能問題辫狼,主要體現在兩個方面:

  1. 因為 Innodb 是以 頁 為單位進行磁盤交互的初斑,而一個事務很可能只修改一個數據頁里面的幾個字節(jié),這個時候將完整的數據頁刷到磁盤的話膨处,太浪費資源了见秤!
  2. 一個事務可能涉及修改多個數據頁,并且這些數據頁在物理上并不連續(xù)真椿,使用隨機IO寫入性能太差鹃答!

因此 mysql 設計了 redo log , 具體來說就是只記錄事務對數據頁做了哪些修改突硝,這樣就能完美地解決性能問題了(相對而言文件更小并且是順序IO)测摔。redo log基本概念

redo log 包括兩部分:一個是內存中的日志緩沖( redo log buffer ),另一個是磁盤上的日志文件( redo logfile)解恰。

mysql 每執(zhí)行一條 DML 語句锋八,先將記錄寫入 redo log buffer,后續(xù)某個時間點再一次性將多個操作記錄寫到 redo log file护盈。這種 先寫日志挟纱,再寫磁盤 的技術就是 MySQL
里經常說到的 WAL(Write-Ahead Logging) 技術。在計算機操作系統(tǒng)中黄琼,用戶空間( user space )下的緩沖區(qū)數據一般情況下是無法直接寫入磁盤的樊销,中間必須經過操作系統(tǒng)內核空間( kernel space )緩沖區(qū)( OS Buffer )。因此脏款, redo log buffer 寫入 redo logfile 實際上是先寫入 OS Buffer 围苫,然后再通過系統(tǒng)調用 fsync() 將其刷到 redo log file

中,過程如下:
image

mysql 支持三種將 redo log buffer 寫入 redo log file 的時機撤师,可以通過 innodb_flush_log_at_trx_commit 參數配置剂府,各參數值含義如下:
image
image

redo log記錄形式前面說過, redo log 實際上記錄數據頁的變更剃盾,而這種變更記錄是沒必要全部保存腺占,因此 redo log實現上采用了大小固定,循環(huán)寫入的方式痒谴,當寫到結尾時衰伯,會回到開頭循環(huán)寫日志。如下圖:
image

同時我們很容易得知积蔚, 在innodb中意鲸,既有redo log 需要刷盤,還有 數據頁 也需要刷盤, redo log存在的意義主要就是降低對 數據頁 刷盤的要求 ** 怎顾。在上圖中读慎, write pos 表示 redo log 當前記錄的 LSN (邏輯序列號)位置, check point 表示 數據頁更改記錄 刷盤后對應 redo log 所處的 LSN(邏輯序列號)位置槐雾。write pos 到 check point 之間的部分是 redo log 空著的部分夭委,用于記錄新的記錄;check point 到 write pos 之間是 redo log 待落盤的數據頁更改記錄募强。當 write pos追上check point 時株灸,會先推動 check point 向前移動,空出位置再記錄新的日志擎值。啟動 innodb 的時候蚂且,不管上次是正常關閉還是異常關閉,總是會進行恢復操作幅恋。因為 redo log記錄的是數據頁的物理變化,因此恢復的時候速度比邏輯日志(如 binlog )要快很多泵肄。重啟innodb 時捆交,首先會檢查磁盤中數據頁的 LSN ,如果數據頁的LSN 小于日志中的 LSN 腐巢,則會從 checkpoint 開始恢復品追。還有一種情況,在宕機前正處于checkpoint 的刷盤過程冯丙,且數據頁的刷盤進度超過了日志頁的刷盤進度肉瓦,此時會出現數據頁中記錄的 LSN 大于日志中的 LSN,這時超出日志進度的部分將不會重做胃惜,因為這本身就表示已經做過的事情泞莉,無需再重做。redo log與binlog區(qū)別
image

由 binlog 和 redo log 的區(qū)別可知:binlog 日志只用于歸檔船殉,只依靠 binlog 是沒有 crash-safe 能力的鲫趁。但只有 redo log 也不行,因為 redo log 是 InnoDB特有的利虫,且日志上的記錄落盤后會被覆蓋掉挨厚。因此需要 binlog和 redo log二者同時記錄,才能保證當數據庫發(fā)生宕機重啟時糠惫,數據不會丟失疫剃。

undo log

數據庫事務四大特性中有一個是 原子性 ,具體來說就是 原子性是指對數據庫的一系列操作硼讽,要么全部成功巢价,要么全部失敗,不可能出現部分成功的情況。實際上蹄溉, 原子性 底層就是通過 undo log 實現的咨油。undo log主要記錄了數據的邏輯變化,比如一條 INSERT 語句柒爵,對應一條DELETE 的 undo log 役电,對于每個 UPDATE 語句,對應一條相反的 UPDATE 的 undo log 棉胀,這樣在發(fā)生錯誤時法瑟,就能回滾到事務之前的數據狀態(tài)。同時唁奢, undo log 也是 MVCC(多版本并發(fā)控制)實現的關鍵霎挟。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末凄杯,一起剝皮案震驚了整個濱河市汤纸,隨后出現的幾起案子,更是在濱河造成了極大的恐慌搅轿,老刑警劉巖脊奋,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬北,死亡現場離奇詭異,居然都是意外死亡诚隙,警方通過查閱死者的電腦和手機讶隐,發(fā)現死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來久又,“玉大人巫延,你說我怎么就攤上這事〉叵” “怎么了炉峰?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脉执。 經常有香客問我讲冠,道長,這世上最難降的妖魔是什么适瓦? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任竿开,我火速辦了婚禮,結果婚禮上玻熙,老公的妹妹穿的比我還像新娘否彩。我一直安慰自己,他們只是感情好嗦随,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布列荔。 她就那樣靜靜地躺著敬尺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贴浙。 梳的紋絲不亂的頭發(fā)上砂吞,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音崎溃,去河邊找鬼蜻直。 笑死,一個胖子當著我的面吹牛袁串,可吹牛的內容都是我干的概而。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼囱修,長吁一口氣:“原來是場噩夢啊……” “哼赎瑰!你這毒婦竟也來了?” 一聲冷哼從身側響起破镰,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤餐曼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲜漩,有當地人在樹林里發(fā)現了一具尸體晋辆,經...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年宇整,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芋膘。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳞青,死狀恐怖,靈堂內的尸體忽然破棺而出为朋,到底是詐尸還是另有隱情臂拓,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布习寸,位于F島的核電站胶惰,受9級特大地震影響,放射性物質發(fā)生泄漏霞溪。R本人自食惡果不足惜孵滞,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸯匹。 院中可真熱鬧坊饶,春花似錦、人聲如沸殴蓬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痘绎,卻和暖如春津函,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孤页。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工尔苦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人散庶。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓蕉堰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悲龟。 傳聞我的和親對象是個殘疾皇子屋讶,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354