mysql獲取邏輯日誌 MySQL 三種日誌

2021-10-17 21:13:16 字數 2935 閱讀 9680

日誌是 資料庫的重要組成部分,記錄著資料庫執行期間各種狀態資訊。日誌主要包括錯誤日誌、查詢日誌、慢查詢日誌、事務日誌、二進位制日誌幾大類。作為開發,我們重點需要關注的是二進位制日誌( )和事務日誌(包括

和 ),本文接下來會詳細介紹這三種日誌。

binlog

用於記錄資料庫執行的寫入性操作(不包括查詢)資訊,以二進位制的形式儲存在磁碟中。 是 的邏輯日誌,並且由 層進行記錄,使用任何儲存引擎的 資料庫都會記錄 日誌。

邏輯日誌:可以簡單理解為記錄的就是sql語句 。

物理日誌: 資料最終是儲存在資料頁中的,物理日誌記錄的就是資料頁變更 。

是通過追加的方式進行寫入的,可以通過 引數設定每個

檔案的大小,當檔案大小達到給定值之後,會生成新的檔案來儲存日誌。

binlog使用場景

在實際應用中, 的主要使用場景有兩個,分別是主從複製和資料恢復。

主從複製:在 端開啟 ,然後將 傳送到各個 端, 端重放 從而達到主從資料一致。

資料恢復:通過使用 工具來恢復資料。

binlog刷盤時機

對於 儲存引擎而言,只有在事務提交時才會記錄 ,此時記錄還在記憶體中,那麼

是什麼時候刷到磁碟中的呢? 通過 引數控制 的刷盤時機,取值範圍是

0:不去強制要求,由系統自行判斷何時寫入磁碟;

1:每次 的時候都要將 寫入磁碟;

n:每n個事務,才會將 寫入磁碟。

從上面可以看出, 最安全的是設定是 ,這也是

之後版本的預設值。但是設定乙個大一些的值可以提公升資料庫效能,因此實際情況下也可以將值適當調大,犧牲一定的一致性來獲取更好的效能。

binlog日誌格式

日誌有三種格式,分別為 、 和 。

在 之前,預設的格式是 , 之後,預設值是 。日誌格式通過 指定。

:基於 語句的複製( ),每一條會修改資料的sql語句會記錄到 中 。

優點:不需要記錄每一行的變化,減少了 binlog 日誌量,節約了 io , 從而提高了效能;

缺點:在某些情況下會導致主從資料不一致,比如執行sysdate() 、 slepp() 等 。

:基於行的複製( ),不記錄每條sql語句的上下文資訊,僅需記錄哪條資料被修改了 。

優點:不會出現某些特定情況下的儲存過程、或function、或trigger的呼叫和觸發無法被正確複製的問題 ;

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

:基於 和 兩種模式的混合複製( ),一般的複製使用 模式儲存 ,對於 模式無法複製的操作使用 模式儲存

redo log

為什麼需要redo log

我們都知道,事務的四大特性裡面有乙個是永續性,具體來說就是

只要事務提交成功,那麼對資料庫做的修改就被永久儲存下來了,不可能因為任何原因再回到原來的狀態。那麼

是如何保證一致性的呢?最簡單的做法是在每次事務提交的時候,將該事務涉及修改的資料頁全部重新整理到磁碟中。但是這麼做會有嚴重的效能問題,主要體現在兩個方面:

因為 是以 為單位進行磁碟互動的,而乙個事務很可能只修改乙個資料頁裡面的幾個位元組,這個時候將完整的資料頁刷到磁碟的話,太浪費資源了!

乙個事務可能涉及修改多個資料頁,並且這些資料頁在物理上並不連續,使用隨機io寫入效能太差!

因此 設計了 ,具體來說就是只記錄事務對資料頁做了哪些修改

,這樣就能完美地解決效能問題了(相對而言檔案更小並且是順序io)。

redo log基本概念

包括兩部分:乙個是記憶體中的日誌緩衝( ),另乙個是磁碟上的日誌檔案( )。 每執行一條 語句,先將記錄寫入

,後續某個時間點再一次性將多個操作記錄寫到 。這種先寫日誌,再寫磁碟的技術就是

裡經常說到的 技術。

在計算機作業系統中,使用者空間( )下的緩衝區資料一般情況下是無法直接寫入磁碟的,中間必須經過作業系統核心空間( )緩衝區( )。因此, 寫入 實際上是先寫入 ,然後再通過系統呼叫 將其刷到

中,過程如下:

支援三種將 寫入 的時機,可以通過 引數配置,各引數值含義如下:

redo log記錄形式

前面說過, 實際上記錄資料頁的變更,而這種變更記錄是沒必要全部儲存,因此

實現上採用了大小固定,迴圈寫入的方式,當寫到結尾時,會回到開頭迴圈寫日誌。如下圖:

同時我們很容易得知, 在innodb中,既有 需要刷盤,還有 也需要刷盤, 存在的意義主要就是降低對 刷盤的要求 ** 。在上圖中, 表示 當前記錄的 (邏輯序列號)位置, 表示資料頁更改記錄刷盤後對應 所處的 (邏輯序列號)位置。 到 之間的部分是 空著的部分,用於記錄新的記錄; 到 之間是 待落盤的資料頁更改記錄。當 追上 時,會先推動 向前移動,空出位置再記錄新的日誌。

啟動 的時候,不管上次是正常關閉還是異常關閉,總是會進行恢復操作。因為 記錄的是資料頁的物理變化,因此恢復的時候速度比邏輯日誌(如 )要快很多。重啟 時,首先會檢查磁碟中資料頁的 ,如果資料頁的 小於日誌中的 ,則會從 開始恢復。還有一種情況,在宕機前正處於

的刷盤過程,且資料頁的刷盤進度超過了日誌頁的刷盤進度,此時會出現資料頁中記錄的 大於日誌中的

,這時超出日誌進度的部分將不會重做,因為這本身就表示已經做過的事情,無需再重做。

redo log與binlog區別

由 和 的區別可知: 日誌只用於歸檔,只依靠 是沒有 能力的。但只有 也不行,因為 是

特有的,且日誌上的記錄落盤後會被覆蓋掉。因此需要 和

二者同時記錄,才能保證當資料庫發生宕機重啟時,資料不會丟失。

undo log

資料庫事務四大特性中有乙個是原子性,具體來說就是原子性是指對資料庫的一系列操作,要麼全部成功,要麼全部失敗,不可能出現部分成功的情況

。實際上,原子性底層就是通過 實現的。 主要記錄了資料的邏輯變化,比如一條 語句,對應一條 的 ,對於每個 語句,對應一條相反的 的 ,這樣在發生錯誤時,就能回滾到事務之前的資料狀態。同時, 也是 (多版本併發控制)實現的關鍵。

如果你覺得文章不錯,文末的贊 又回來啦,記得給我「點讚」和「在看」哦~

mysql日誌系統 SQL 邏輯日誌 物理日誌

更新語句執行的流程和查詢語句執行的流程一樣 注意 在乙個表上有更新的操作的時候,和這個表相關的查詢快取就會被清空 在經歷分析器,優化器,和執行器儲存引擎的歷程中,還多了重要的日誌模組 redo log 重做日誌 bin log 歸檔日誌 是innodb 引擎獨有的日誌模組 它的關鍵點就是更新的時候先...

將awstats分析日誌結果匯入mysql

利用awstats分析web日誌的結果只能匯出為html或者pdf檔案格式,想要匯出為其他檔案或者對分析結果再分析,例如對使用者行為分析則顯得有些力不從心,這就需要用到將awstats分析結果匯入到mysql資料庫中,利用sql語句進行分析或者匯出為其他格式 2 dbi data showtable...

mysql 多邏輯 MySql邏輯架構

一 mysql伺服器邏輯架構圖 每個虛線框都是一層 第二層 大多數的mysql的核心服務功能都在這一層,包括查詢解析 分析 優化 快取以及所有的內建函式 例如 日期,時間,數學和加密函式等 所有跨儲存引擎的功能都在這一層實現 儲存過程,觸發器,檢視。第三層 包含了儲存引擎。儲存引擎負責mysql中的...