Mysql Log 介紹

Mysql Log 介紹

[TOC]算法

參考: sql

redo log 和 undo log 區別緩存

一文了解InnoDB存儲引擎併發

前言

涉及到的知識面有 Buffer Pool & Redo Log & Undo Log & BinLog & CheckPoint & 髒頁。.net

若是每次數據更改操做都直接操做到磁盤上的話,當操做數量多起來的話,那麼這些操做將變的很慢。爲了提升操做之間的併發度,Mysql設計了緩存系統。設計

1、Buffer Pool

緩存池。當數據完成更改後,不會立馬同步到磁盤上,而是先放到緩存池中。日誌

2、Redo Log & Undo Log

2.1 Redo Log

爲了防止系統掉電後,緩存池中的數據不丟失,即保證事務的持久性,特此記錄一份數據修改以後的Log。例如,事務將 a 從 1 -> 2,b 從 4 -> 3,那麼 Log 會記錄 a:2, b:3。code

2.1.1 特色

  1. 大小固定,能夠經過命令設置innodb_log_write_ahead_size
  2. 寫滿以後,繼續重頭寫,覆蓋以前寫的內容;

2.1.2 CHECKPOINT

CHECKPOINT的做用就是記錄上次刷入磁盤截止的位置,這樣就不用每次都刷整個 redo log了。blog

髒頁:redo log 上與磁盤數據不一樣的部分叫髒頁,即CHECKPOINT到本次文件光標位置所包含的數據。事務

2.1.3 用途

  1. 解決了數據變更立馬操做磁盤的問題,提升了速度,以後即可以按照策略將redo log的日誌修改數據;
  2. 當系統掉電後,經過 redo log 進行數據恢復;

2.1.4 Redo Log 刷入磁盤

按照redo log上記載的數據變化,將磁盤數據更新。本文講的全部redo log 刷入磁盤都是指,刷入從CHECKPOINT開始到當前文件光標結束的數據。

刷入時機

  1. 定時刷入,每隔一段時間,將redo log 刷入;
  2. lru(最近最少使用)算法刷入,當Buffer Pool 空閒空間不足時,採用LRU算法淘汰緩存記錄。由於緩存不見了,查詢就會打到磁盤,爲了保證數據一致性,得將redo log刷入磁盤;
  3. 日誌不可用刷入,當將要覆蓋的log還未被刷入磁盤時,將redo log刷入磁盤;

2.2 Undo Log

爲了使事務在執行時能回滾到以前的狀態,即保證事務的原子性,特此記錄一份數據修改以前的Log。例如,事務將 a 從 1 -> 2,b 從 4 -> 3,那麼 Log 會記錄 a:1, b:4。

2.2.1 特色

  1. 當日志滿時,新建立文件;
  2. 當文件總量過大時,刪除老舊文件;

2.2.2 用途

  1. 用於事務回滾;
  2. 實現 MVCC(多版本併發控制);

2.3 記錄步驟

假設有A、B兩個數據,值分別爲1,2.

  1. 事務開始.
  2. 記錄A=1到undo log.
  3. 修改A=3.
  4. 記錄A=3到redo log.
  5. 記錄B=2到undo log.
  6. 修改B=4.
  7. 記錄B=4到redo log.
  8. 將undo log 寫入磁盤.
  9. 將redo log寫入磁盤.
  10. 事務提交.

3、Binlog

Binlog是隻記錄對數據試圖產生變化的行爲,即便你更新先後數據沒變化,也會記錄。

有兩種記錄方式:

  1. 只記錄sql語句;
  2. 記錄執行語句先後的數據行內容;
相關文章
相關標籤/搜索