mysql 日誌系統詳解

mysql 日誌種類

1:重做日誌(redo log)

2:回滾日誌(undo log)

3:二進制日誌(binlog)

4:錯誤日誌(errorlog)

5:慢查詢日誌(slow query log)

6:一般查詢日誌(general log)

7:中繼日誌(relay log)。

mysql 執行命令過程

在這裏插入圖片描述
重點 1.圖中的緩存就是內存層次的緩存不是日誌 2.查詢語句纔會走緩存 更新操作不僅不會走緩存還會清空表的緩存 3.這個圖是最簡單的解釋 實際會更加複雜 不可以死記 4.mysql默認是不開啓緩存的哦

重做日誌(redo log)詳解

  • 作用:確保事務的持久性。防止在發生故障的時間點,尚有髒頁未寫入磁盤,在重啓mysql服務的時候,根據redo log進行重做,從而達到事務的持久性這一特性。
  • 重做日誌是物理日誌,記錄的是數據頁的物理修改,而不是某一行或某幾行修改成怎樣怎樣,它用來恢復提交後的物理數據頁(恢復數據頁,且只能恢復到最後一次提交的位置)。
  • redo日誌是存在於innodb引擎的,是存在於引擎層的特殊日誌。
  • InnoDB 的 redo log 是固定大小的,比如可以配置爲一組 4 個文件,每個文件的大 小是 1GB,那麼redo log總共就可以記錄 4GB 的操作。從頭開始寫,寫到末尾就又回到開 頭循環寫,如下面這個圖所示:
    在這裏插入圖片描述
 1.wirte pos 是當前記錄的位置,一邊寫一邊後移,寫到第 3 號文件末尾後就回到 0 號文件開頭。
 2.checkpoint 是當前要擦除的位置,也是往後推移並且循環的,便是擦除記錄前要把記錄更新到數據文件。你可以把checkpoint想像成破壞着,他所指的地方寸草不生。
3.write pos 和 checkpoint 之間的是“粉板”上還空着的部分,可以用來記錄新的操作。
4.如果 write pos 追上 checkpoint,表示“粉板”滿了,這時候不能再執行新的更新,得停下來先擦 掉一些記錄,把 checkpoint 推進一下。
爲了控制 redo log 的寫入策略,InnoDB 提供了 innodb_flush_log_at_trx_commit 參數,它有三種可能取值:

1)設置爲 0 的時候,表示每次事務提交時都只是把 redo log 留在 redo log buffer 中 ;
2)設置爲 1 的時候,表示每次事務提交時都將 redo log 直接持久化到磁盤;
3)設置爲 2 的時候,表示每次事務提交時都只是把 redo log 寫到 page cache。InnoDB 有一個後臺線程,每隔 1 秒,就會把 redo log buffer 中的日誌,調用 write 寫到文件系統的 page cache,然後調用 fsync 持久化到磁盤。

進制日誌(binlog)詳解

  • 作用:用於複製,在主從複製中,從庫利用主庫上的binlog進行重播,實現主從同步;用於數據庫的基於時間點的還原;記錄了對數據庫的更新操作
既然有了redo 日誌 爲啥還有binlog 日誌,因爲他們都存在還原的功能這存在功能的重複???
這是歷史問題。最開始的Mysql用的不是InnoDB引擎,而是MyISAM引擎,那時的MyISAM是沒有crash-safe能力的,binlog只能用於歸檔。而InnoDB引入Mysql後,要克服Mysql沒有crash-safe的能力,就引入了現在的redo log日誌。
binlog 日誌與 redo 日誌區別:
1.層次不同:redo log 是InnoDB引擎所特有的;binlog是MySql的server層實現的,所有引擎都可使用
2.格式不同:redo log是物理日誌,記錄的是“在某個數據頁上做了什麼修改”;binlog是邏輯日誌,記錄的是這個語句的原始邏輯,比如“給ID=2這一行的c字段加1”。
3.寫入方式不同:redo是循環寫,因爲空間是固定的早晚會用完;binlog是追加寫,即一個文件寫滿後切換到下一個,並不會覆蓋以前的日誌。

回滾日誌(undo log)

  • 基本概念
undo log有兩個作用:提供回滾和多個行版本控制(MVCC)。

在數據修改的時候,不僅記錄了redo,還記錄了相對應的undo,如果因爲某些原因導致事務失敗或回滾了,可以藉助該undo進行回滾。
undo log和redo log記錄物理日誌不一樣,它是邏輯日誌。可以認爲當delete一條記錄時,undo log中會記錄一條對應的insert記錄,反之亦然,當update一條記錄時,它記錄一條對應相反的update記錄。
當執行rollback時,就可以從undo log中的邏輯記錄讀取到相應的內容並進行回滾。有時候應用到行版本控制的時候,也是通過undo log來實現的:當讀取的某一行被其他事務鎖定時,它可以從undo log中分析出該行記錄以前的數據是什麼,從而提供該行版本信息,讓用戶實現非鎖定一致性讀取。
undo log是採用段(segment)的方式來記錄的,每個undo操作在記錄的時候佔用一個undo log segment。
另外,undo log也會產生redo log,因爲undo log也要實現持久性保護。

錯誤日誌(errorlog)

  • 基本概念
MySQL的錯誤日誌用於記錄MySQL服務進程mysqld在啓動/關閉或運行過程中遇到的錯誤信息。

慢查詢日誌(slow query log)

MySQL 慢查詢日誌是排查問題 SQL 語句,以及檢查當前 MySQL 性能的一個重要功能。
以下是可以設置的選項
slow_query_log 慢查詢開啓狀態
slow_query_log_file 慢查詢日誌存放的位置(這個目錄需要MySQL的運行帳號的可寫權限,一般設置爲MySQL的數據存放目錄)
long_query_time 查詢超過多少秒才記錄

一般查詢日誌(general log)

MySQL的查詢日誌記錄了所有MySQL數據庫請求的信息。無論這些請求是否得到了正確的執行。

中繼日誌(relay log)。

用於主從庫中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章