主頁 > 後端開發 > 面試官:MySQL 中的 3 大日志是指哪些?面試必問!

面試官:MySQL 中的 3 大日志是指哪些?面試必問!

2021-11-02 12:05:02 後端開發

轉自:陳添明
鏈接:https://juejin.im/post/6860252224930070536
?

日志是 mysql 資料庫的重要組成部分,記錄著資料庫運行期間各種狀態資訊,mysql日志主要包括錯誤日志、查詢日志、慢查詢日志、事務日志、二進制日志幾大類,

作為開發,我們重點需要關注的是二進制日志( binlog )和事務日志(包括redo logundo log ),本文接下來會詳細介紹這三種日志,

binlog

binlog 用于記錄資料庫執行的寫入性操作(不包括查詢)資訊,以二進制的形式保存在磁盤中,binlogmysql的邏輯日志,并且由 Server 層進行記錄,使用任何存盤引擎的 mysql 資料庫都會記錄 binlog 日志,

  • 邏輯日志:可以簡單理解為記錄的就是sql陳述句 ,
  • 物理日志mysql 資料最終是保存在資料頁中的,物理日志記錄的就是資料頁變更 ,

binlog 是通過追加的方式進行寫入的,可以通過max_binlog_size 引數設定每個 binlog檔案的大小,當檔案大小達到給定值之后,會生成新的檔案來保存日志,

binlog使用場景

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

  1. 主從復制 :在 Master 端開啟 binlog ,然后將 binlog發送到各個 Slave 端, Slave 端重放 binlog 從而達到主從資料一致,
  2. 資料恢復 :通過使用 mysqlbinlog 工具來恢復資料,

binlog刷盤時機

對于 InnoDB 存盤引擎而言,只有在事務提交時才會記錄biglog ,此時記錄還在記憶體中,那么 biglog是什么時候刷到磁盤中的呢?

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

  • 0:不去強制要求,由系統自行判斷何時寫入磁盤;
  • 1:每次 commit 的時候都要將 binlog 寫入磁盤;
  • N:每N個事務,才會將 binlog 寫入磁盤,

從上面可以看出, sync_binlog 最安全的是設定是 1 ,這也是MySQL 5.7.7之后版本的默認值,但是設定一個大一些的值可以提升資料庫性能,因此實際情況下也可以將值適當調大,犧牲一定的一致性來獲取更好的性能,

binlog日志格式

binlog 日志有三種格式,分別為 STATMENTROWMIXED

MySQL 5.7.7 之前,默認的格式是 STATEMENTMySQL 5.7.7 之后,默認值是 ROW,日志格式通過 binlog-format 指定,

  • STATMENT:基于SQL 陳述句的復制( statement-based replication, SBR ),每一潭訓修改資料的sql陳述句會記錄到binlog 中 ,

    • 優點:不需要記錄每一行的變化,減少了 binlog 日志量,節約了 IO , 從而提高了性能;
    • 缺點:在某些情況下會導致主從資料不一致,比如執行sysdate() 、 slepp() 等 ,
  • ROW:基于行的復制(row-based replication, RBR ),不記錄每條sql陳述句的背景關系資訊,僅需記錄哪條資料被修改了 ,

    • 優點:不會出現某些特定情況下的存盤程序、或function、或trigger的呼叫和觸發無法被正確復制的問題 ;
    • 缺點:會產生大量的日志,尤其是alter table 的時候會讓日志暴漲
  • MIXED:基于STATMENTROW 兩種模式的混合復制(mixed-based replication, MBR ),一般的復制使用STATEMENT 模式保存 binlog ,對于 STATEMENT 模式無法復制的操作使用 ROW 模式保存 binlog

redo log

為什么需要redo log

我們都知道,事務的四大特性里面有一個是 持久性 ,具體來說就是只要事務提交成功,那么對資料庫做的修改就被永久保存下來了,不可能因為任何原因再回到原來的狀態

那么 mysql是如何保證一致性的呢?

最簡單的做法是在每次事務提交的時候,將該事務涉及修改的資料頁全部重繪到磁盤中,但是這么做會有嚴重的性能問題,主要體現在兩個方面:

  1. 因為 Innodb 是以 為單位進行磁盤互動的,而一個事務很可能只修改一個資料頁里面的幾個位元組,這個時候將完整的資料頁刷到磁盤的話,太浪費資源了!
  2. 一個事務可能涉及修改多個資料頁,并且這些資料頁在物理上并不連續,使用隨機IO寫入性能太差!

因此 mysql 設計了 redo log具體來說就是只記錄事務對資料頁做了哪些修改,這樣就能完美地解決性能問題了(相對而言檔案更小并且是順序IO),

redo log基本概念

redo log 包括兩部分:一個是記憶體中的日志緩沖( redo log buffer ),另一個是磁盤上的日志檔案( redo logfile),

mysql 每執行一條 DML 陳述句,先將記錄寫入 redo log buffer,后續某個時間點再一次性將多個操作記錄寫到 redo log file,這種 先寫日志,再寫磁盤 的技術就是 MySQL
里經常說到的 WAL(Write-Ahead Logging) 技術,

在計算機作業系統中,用戶空間( user space )下的緩沖區資料一般情況下是無法直接寫入磁盤的,中間必須經過作業系統內核空間( kernel space )緩沖區( OS Buffer ),

因此, redo log buffer 寫入 redo logfile 實際上是先寫入 OS Buffer ,然后再通過系統呼叫 fsync() 將其刷到 redo log file
中,程序如下:

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

redo log記錄形式

前面說過, redo log 實際上記錄資料頁的變更,而這種變更記錄是沒必要全部保存,因此 redo log實作上采用了大小固定,回圈寫入的方式,當寫到結尾時,會回到開頭回圈寫日志,如下圖:

同時我們很容易得知, 在innodb中,既有redo log 需要刷盤,還有 資料頁 也需要刷盤, redo log存在的意義主要就是降低對 資料頁 刷盤的要求 ** ,

在上圖中, write pos 表示 redo log 當前記錄的 LSN (邏輯序列號)位置, check point 表示 資料頁更改記錄 刷盤后對應 redo log 所處的 LSN(邏輯序列號)位置,

write poscheck point 之間的部分是 redo log 空著的部分,用于記錄新的記錄;check pointwrite pos 之間是 redo log 待落盤的資料頁更改記錄,當 write pos追上check point 時,會先推動 check point 向前移動,空出位置再記錄新的日志,

啟動 innodb 的時候,不管上次是正常關倍訓是例外關閉,總是會進行恢復操作,因為 redo log記錄的是資料頁的物理變化,因此恢復的時候速度比邏輯日志(如 binlog )要快很多,

重啟innodb 時,首先會檢查磁盤中資料頁的 LSN ,如果資料頁的LSN 小于日志中的 LSN ,則會從 checkpoint 開始恢復,

還有一種情況,在宕機前正處于checkpoint 的刷盤程序,且資料頁的刷盤進度超過了日志頁的刷盤進度,此時會出現資料頁中記錄的 LSN 大于日志中的 LSN,這時超出日志進度的部分將不會重做,因為這本身就表示已經做過的事情,無需再重做,

redo log與binlog區別

binlogredo log 的區別可知:binlog 日志只用于歸檔,只依靠 binlog 是沒有 crash-safe 能力的,

但只有 redo log 也不行,因為 redo logInnoDB特有的,且日志上的記錄落盤后會被覆寫掉,因此需要 binlogredo log二者同時記錄,才能保證當資料庫發生宕機重啟時,資料不會丟失,

undo log

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

實際上, 原子性 底層就是通過 undo log 實作的,undo log主要記錄了資料的邏輯變化,比如一條 INSERT 陳述句,對應一條DELETEundo log ,對于每個 UPDATE 陳述句,對應一條相反的 UPDATEundo log ,這樣在發生錯誤時,就能回滾到事務之前的資料狀態,

同時, undo log 也是 MVCC(多版本并發控制)實作的關鍵,

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.別在再滿屏的 if/ else 了,試試策略模式,真香!!

3.臥槽!Java 中的 xx ≠ null 是什么新語法?

4.Spring Boot 2.5 重磅發布,黑暗模式太炸了!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/344469.html

標籤:Java

上一篇:面試官問我JVM記憶體結構,我真的是

下一篇:maven編譯后復制到目標位置

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more