MySQL 筆記整理(2) --日誌系統,一條SQL查詢語句如何執行

来源:https://www.cnblogs.com/dogtwo0214/archive/2019/02/25/10432532.html
-Advertisement-
Play Games

筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 2) --日誌系統,一條SQL查詢語句如何執行 MySQL可以恢復到半個月內任意一秒的狀態,它的實現和日誌系統有關。上一篇中記錄了一條查詢語句是如何執行的,對於更新語句,這一套流程也是同樣會走一遍。與查詢流程不一樣的是,更新流程還涉及到兩個重要 ...


筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》

2) --日誌系統,一條SQL查詢語句如何執行

  MySQL可以恢復到半個月內任意一秒的狀態,它的實現和日誌系統有關。上一篇中記錄了一條查詢語句是如何執行的,對於更新語句,這一套流程也是同樣會走一遍。與查詢流程不一樣的是,更新流程還涉及到兩個重要的日誌模塊。redo log(重做日誌) 和 binlog(歸檔日誌)。

redo log:

  這裡林老師舉了一個很好的例子,摘錄如下。

  《孔乙己》中的酒店掌柜有一個粉板,用來記錄客人的賒賬記錄。如果賒賬的人不多,他可以把顧客名和賬目寫在粉板上。如果賒賬的人太多,粉板寫不下了,掌柜的還會有一個專門記錄賒賬的賬本。如果有人要賒賬或者還賬的話,掌柜的一般有兩種做法:

    1. 一種做法是直接把賬本翻出來,把這次賒賬的記錄加上去或者除掉。
    2. 另一種做法是先再粉板上記下這次的賬,等打烊以後再把賬本翻出來核算。

  如果客人太多,掌柜的一定會選擇後者,因為前者的操作實在是太麻煩了。要在賬本上翻上個幾十頁再一條條的查找,然後再用算盤計算。相比之下,在粉板上記錄下來就簡單的多。

  同樣,在MySQL里也會有這個問題。如果每次更新操作都要寫進磁碟,然後磁碟也要找到對應的那條記錄,然後再更新,整個過程IO成本及查找成本都很高。

 

  1. MySQL中這種類似粉板和賬本配合的過程就是WAL技術(Write-Ahead Logging)它的關鍵點是先寫日誌,再寫磁碟。
  2. 當一條記錄需要更新時,InnoDB引擎就會先把記錄寫到redo log裡面,並更新記憶體(粉板)。同時,InnoDB引擎會在適當的時候將他更新到磁碟里(賬單)。  
  3. redo log的大小是固定。因此如果系統繁忙,redo log很快就會寫滿。此時就不得不先把一部分記錄更新到磁碟里,然後再進行後續的寫入。
  4. 有了redo log, InnoDB就可以保證記錄不會丟失,這個能力稱為 crash-safe。(掌柜把記錄寫入了粉板,沒寫入賬單。晚上掌柜的忘記這件事了(DB異常重啟),一看粉板(redo log)也可以重新寫入賬單)

binlog:

  1. 之前提到過MySQL分為兩層,一是Server層,另一個是引擎層。redo log是InnoDB引擎特有的日誌,而Server層也有自己的日誌,成為binlog(歸檔日誌)
  2. redo log 與 binlog 有三點不同:
  • redo log是InnoDB引擎特有的日誌,binlog是MySQL的Server層實現,所有引擎都可以使用。
  • redo log是物理日誌,記錄的是“在某個數據頁上做了什麼操作”;binlog是邏輯日誌,記錄是語句的原始邏輯,比如“給ID=2這一行的c欄位加1”.
  • redo log大小固定,迴圈寫入。binlog可以追加寫,不會覆蓋以前的日誌。

兩階段提交:

 

(圖片來源於 極客時間 林曉斌 《MySQL 實戰45講》,如有版權問題請聯繫我刪除)

  可以看到最後一部分把redo log拆成了兩部分,prepare和commit,這就是“兩階段”提交。

  關於兩階段提交,如果不這樣做的話則上述過程會演變成先寫完redo log或者先寫完binlog,假設在寫完一個log,正在寫第二個log時發生異常

  1. 先寫redo log:前面有提到,由於redo log已經寫完,仍能將redo log中的數據恢復回來。但由於binlog中沒有這個記錄,所以當你使用binlog來恢復臨時庫時,臨時庫便會少一次邏輯上的更新,即臨時庫認為沒有這次的更新,故與原數據不同。
  2. 先寫binlog:由於binlog已經寫完,恢復臨時庫時會執行這次的操作,但redo log中並沒有相關記錄,這個事務無效也無法恢復,與=原數據不同。

另:innodb_flush_log_at_trx_commit這個參數設置為1表示把redo log直接持久化到磁碟,保證mysql異常重啟之後數據不丟失。

sync_binlog設置為1時表示binlog持久化到磁碟,保證mysql異常重啟後binlog不丟失。

 

上篇問題答案:

如果表T中沒有欄位k,而去執行這個語句 select * from T where k = 1,那麼會報錯“Unknown column ‘k’ in ‘where clause’”。請問這個錯誤是在哪個階段報出的?

答案是 分析器。筆記中有暗示啦,

分析器:分析器會先做“詞法分析”,即從你輸入的"select"這個關鍵字識別出來這是一個查詢語句,把你輸入的字元串“ID”識別成“列ID”。之後會進行“語法分析”,判斷你輸入的sql語句是否滿足語法規則。

 

問題:

請問在什麼場景下,一天一次備份會比一周一次備份更有優勢?或者說,它影響了這個數據系統的哪些指標?

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.運行 gpedit.msc →computer configuration→administrative templates→windows componets→Remote Desktop→Remote Desktop session host→Connections→Limit number ...
  • 在Linux系統下,有七類文件類型: 普通文件( ) 目錄(d) 軟鏈接(字元鏈接L) 套接字文件(S) 字元設備(S) 塊設備(B) 管道文件(命名管道P) 普通文件、目錄、軟鏈接無需多解釋。 管道文件 管道分為 匿名管道和命名管道 。管道都是一端寫入、另一端讀取,它們是單方向數據傳輸的,它們的數 ...
  • 首先添加php官方源 $ sudo add-apt-repository ppa:ondrej/php 然後更新源 $ sudo apt-get update 然後安裝 $ sudo apt-get install php7.0 php7.0-cli php7.0-fpm php7.0-gd php ...
  • 轉自:http://www.maomao365.com/?p=8102 摘要: 下文講述向已存在表上添加新欄位及欄位備註的方法,如下所示: 實驗環境:sql server 2008 R2 1. 添加新欄位及欄位備註的語法USE 資料庫名ALTER TABLE 表名 ADD 欄位名 類型 預設值 是否 ...
  • 最近項目升級,需要把原來的oracle版本改為sql server版本。由於項目的分層設計,主要的修改內容也就是存儲過程,sql語句。如今改的七七八八,整理一下踩過的坑,備忘! ...
  • 一、監聽某一節點內容 二、監聽某節點目錄的變化 三、Zookeeper當太上下線的感知系統 1.需求:某分散式系統中,主節點有多台,可以進行動態上下限,當有任何一臺機器發生了動態的上下線, 任何一臺客戶端都能感知得到 2.思路: (1)創建客戶端與服務端 (2)啟動client端 並監聽 (3)啟動 ...
  • 一、Zookeeper概述 1.Zookeeper是Hadoop生態的管理者,它致力於開發和維護開源伺服器,實現高度可靠的分散式協調。 2.Zookeeper的兩大功能: (1)存儲數據 (2)監聽 3.Zookeeper的工作機制,如圖: 4.Zookeeper存儲結構,以樹狀結構存儲 5.Zoo ...
  • Redis 中資料庫鍵的過期時間都保存在過期字典中,當一個鍵過期了,Redis 存在三種不同的刪除策略:定時刪除、惰性刪除和定期刪除 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...