MySQL的日誌模組

2021-09-05 12:13:43 字數 941 閱讀 8930

mysql的持久化能力非常強大,它可以恢復到兩周內任意一秒的狀態。像查詢所需要執行的一套流程,更新也會再執行一次。如果不知道,可以看這裡.

mysql的底層機制

但是更新操作會牽扯到日誌模組,這裡的日誌是redo log與bin log。也就是我們常說的重做日誌和歸檔日誌。

目錄

redo log

bin log

在mysql裡,如果每一次更新操作都要先查詢再更新,這樣它所需要耗費的資源是相當高的,這樣會讓整個io成本與查詢成本都會很高,而且效率非常「感人」。所以這時候,它並不是先查詢再更新的,而是每次先把更新的語句寫到日誌裡,然後等空閒的時候再去查詢,然後更改。

這裡所用的技術就是wal(whitr-ahead log)技術,它就是先寫日誌,然後再寫磁碟。當你執行一條更新語句的時候,innodb首先會去將這條語句記錄在redo log中,等在系統閒置的時候再去將整條操作更新到磁碟。

如果某次更新操作特別多,應該怎麼辦?innodb的redo log是固定大小的,但是它可以配置幾組檔案,然後從頭開始寫,寫到末尾再重頭開始寫。就相當於是一條鍊錶,然後設立指標聯動。最先開始動的指標進行寫操作,後面的指標進行擦除操作,也就是將這條操作更新到磁碟裡面。當快指標把最後乙個節點寫完之後,再重新回到頭結點,然後重新開始。

這樣,哪怕innodb引擎不小心重啟的話,它裡面也不會丟失資料。這種操作是crash-safe。

前面講的redo log是屬於儲存引擎層,而這裡的bin log則是屬於service層的日誌。在以前,mysql的儲存引擎不是innodb而是myisam,這種儲存引擎並沒有redo log,而只有bin log。如果說redo log是一種物理操作,那麼bin log就是一種邏輯操作。它記錄的是這個語句的原始邏輯。redo log是迴圈寫的,就像一塊黑板,就那麼大,寫完了就擦了以前寫的東西然後繼續寫。而bin log可以理解為乙個本子,寫完了一張翻過一張繼續寫。

MySQL日誌模組

mysql中有乙個重要的技術叫wal write ahead logging 意思是寫入資料之前先寫日誌。當有一條update語句需要執行的時候,innodb引擎會先把修改的記錄寫到redo log中,並將資料的變更寫入記憶體中的page pool中,不用每次都把修改的資料寫入磁碟。innodb的後...

日誌模組 logging模組

logging.debug 通常除錯時用到的日誌資訊 logging.info 證明事情按照預期的那樣工作 longging.warning 表明發生了意外,或者不就得將來發生的問題 如 磁碟滿了 軟體還是正常的工作 longging.error 由於更嚴重的問題導致軟體已經不能繼續執行某些功能 l...

Java的日誌模組

目前主流的是是logback和log4j2,它們底層實現用的都是slf4j,通過slf4j api呼叫 使用指定類初始化日誌物件,在日誌輸出的時候,可以列印出日誌資訊所在類 如 logger logger logge ctory.getlogger com.book.class logger.deb...