MySQL的crash safe的原理

2022-08-24 03:57:15 字數 2157 閱讀 2769

前面的四個分別是server層的元件,後面儲存引擎層是外掛程式,如innodb,myisam,memory等

聯結器聯結器的作用主要是維持和客戶端之間的通訊功能。同時還負責同客戶端的認證和授權的功能。

每個連線在完成認證和授權後就會一直維持乙個長連線,建立完連線的後的所有通訊都不需要進行再次進行認證,但每次sql請求操作都會有許可權的認證

在連線完成後,如果連線長時間沒有sql請求通訊,該連線會處於sleep狀態,直到超過mysql例項配置的wait_timeout引數的時間後,聯結器會主動斷開該長連線。mysql例項預設的wait_timeout的的時間是8小時

分析器分析器的執行分為兩個過程,乙個是詞法分析,另乙個是語法分析

我們傳送的sql語句是乙個字串,裡面可能存在空格和字串。詞法分析器的作用就是把這個字串代表的意思進行資料的格式化,比如select子串標識這是乙個讀請求,from t_table表示要操作t_table這張表

語法分析的作用是要對這個語法的正確性做乙個檢查,如果當前的sql語法不符合mysql的語法,那麼就直接報錯了,不進行下一步的執行

優化器優化器的作用是根據分析器得出的結果再結合當前表資料的儲存情況來的出乙個查詢效率最高的執行計畫。常見的情況有「:

同乙個sql語句中存在多個索引列條件,那麼應該先選擇哪個索引先進行查詢

多表join操作的時候,如何選擇哪個表作為驅動表等

上面兩種情況都是優化器等工作職責

執行器執行器的作用就是負責呼叫底層儲存引擎實現的抽象介面,按照優化器輸出的執行計畫進行執行。執行器才是真正負責執行sql操作的元件

儲存引擎

儲存引擎的作用就是當初mysql實現的時候留下的可擴充套件的點,不同的儲存引擎的實現可以有著不同的應用場景。mysql為儲存引擎定乙個統一的抽象介面,只要不同的儲存引擎實現該抽象介面就能被上層的執行器比如oltp的場景下需要資料庫事務的支援,那麼innodb就是好的選擇。而在需要大量讀請求而寫請求少,並且不需要事物的情況下myisam是乙個好的選擇

一條sql的執行就是上面的元件從上到下的執行順序,下面就用mysql預設的innodb引擎進行展開看看innodb的執行原理

redo-log

innodb有乙個重要的模組:redo-log,它是innodb支援事物的重要模組。redo-log是物理日誌,它記錄了哪乙個資料頁上做了什麼修改。可以說如果沒有redo-log,innodb就不具有crash-safe的能力

redo-log是由一組分別為4個固定大小檔案組成。可以通過mysql的引數來指定檔案的大小。作為日誌檔案,redo-log是順序寫的,所以寫對磁碟來說是非常高效的。資料的結構可以看成是下面的圖

check-point是當前的資料擦除指標,標識了當前redo-log的擦除檔案位置。write-point是寫指標,標識了當前的資料寫檔案位置。innodb要保證的是write-point不能超過check-point。check-point要一直保持在write-point之前的一段距離。

bin-log

bin-log是mysql的server層實現的邏輯日誌,相當於記錄的sql語句的操作邏輯。

兩階段提交

innodb是如何實現crash-safe的呢?乙個需要知道的理論就是兩階段提交

兩階段提交用簡單點的話講就是:

先讀取資料,並更新然後將新行資料儲存在記憶體中

將物理更新記錄寫入redo-log,並標記這條記錄為prepare狀態(第一步)

innodb將操作提交到執行器,執行器再將邏輯更新記錄寫入bin-log,同時呼叫引擎的寫入和更新介面將磁碟檔案更新

上一步操作完成後再提交事物,將redo-log中對應的記錄狀態改為commit狀態(第二步)

返回更新結果

崩潰後的資料恢復階段

如果在更新或寫入資料的過程中,機器出現崩潰。那麼在機器在重啟後,mysql會首先去驗證redolog的完整性,如果redolog中沒有prepare狀態的記錄,則記錄是完整的,就日記提交。如果redolog中存在prepare記錄,那麼就去驗證這條redolog對應的binlog記錄,如果這條binlog是完整的,那麼完整提交redolog,否則執行回滾邏輯

mysql的恢復 MYSQL的恢復

恢復就簡單多了!只要執行該備份檔案就行了,該備份檔案是sql哦!恢復完全備份mysql uroot p backup.sql 就這麼簡單!恢復增量備份mysqlbinlog mysql bin.000002 mysql u root p 注意此次恢復過程亦會寫入日誌檔案,如果資料量很大,建議先關閉日...

mysql的查詢日誌 mysql

這篇文章總結了mysql中查詢日誌的知識點。mysql中,日誌可以按照功能分為如下幾類。錯誤日誌 查詢日誌 慢查詢日誌 二進位制日誌 中繼日誌 innodb儲存引擎級別的事務日誌 查詢日誌 查詢日誌在mysql中被稱之為general log 通用日誌 不要被 查詢日誌 的名字誤導,錯誤的以為查詢日...

mysql的定義 MySQL定義

什麼是sql sql是結構化查詢語言。什麼是資料庫 資料庫是用來儲存資料的。關聯式資料庫 多張表之間的關係。關聯式資料庫包含表 表名 列 主鍵,通過相應的關係列來產生連線關係。資料庫與資料倉儲 資料庫是用來做交易 transaction 資料倉儲是用來做分析 analytics 資料倉儲的作用在於 ...