Mysql Innodb技術內幕 1

2021-09-25 11:47:01 字數 1564 閱讀 7062

同步機制

innodb儲存引擎並沒有使用操作吸引自帶的mutex和rw-lock,而是自己進行了封裝。並通過spin(自旋) 以及 wait arry(等待佇列)的設計來提高效能

重做日誌 《物理邏輯日誌》

重做日誌(redo log)用來實現事務的永續性

redo log 由兩部分組成:一是記憶體中的重做日誌緩衝buffer,二是重做日誌檔案log

innodb是事務的儲存引擎,其通過force log at commit機制實現事務的永續性。即當事務commit(提交)時,必須先將該事務的所有日誌寫入到重做日誌檔案進行持久化。

redo log用來保證事務的永續性,undo log用於事務回滾和mvcc功能

為了確保每次日誌都寫入到redo log中,在每次將重做日誌緩衝寫入到重做日誌檔案後,innodb儲存引擎都需要呼叫一次fsync操作。因為重做日誌檔案開啟並沒有使用o_direct選項,所有重做日誌先寫入到檔案系統快取。

引數innodb_flush_log_at_trx_commit 用來控制重做日誌重新整理到磁碟的策略。

檢查點

如果說重做日誌的作用是為了在資料庫宕機時完成對資料的恢復,那麼檢查點的作用則是縮短當資料庫發生宕機時資料庫恢復所需要的時間,因為檢查點中儲存的都是物理日誌重新整理到磁碟中的資料記錄長度 lsn。

事務日誌在提交時會確定寫入到外存,但是緩衝池(buffer pool)中的頁並沒有重新整理到磁碟中。頁的重新整理是非同步操作,當前資料庫通常使用檢查點技術

結論:上述需要搞清楚的是 :**物理日誌(這個日誌裡面應該存的就是資料)**和物理邏輯日誌各有優勢,取長補短

mini-transaction模組,其用來實現innodb儲存引擎物理邏輯日誌的寫入,通過mini-transaction來保證併發事務操作下以及資料庫異常時頁中資料一致性

mini_transaction()
在innodb儲存引擎中,每個頁有乙個buf_lock_t物件

struct buf_block_struct{

....

rw_lock_t lock; //這個鎖保證了每個塊的安全性,且是讀寫鎖

ulint buf_fix_count;

物理日誌的邏輯實現

innodb儲存引擎上每個log_block都有一定的說明資訊

每個重做日誌開頭都會有標識資訊:type / space / offset / body

type: 通過設定mlog_single_rec_flag標識來標識該mini-transaction是否僅涉及乙個頁的操作

**在進行mini-transaction模組時,需要持有log_sys_mutex互斥量。因此該互斥量時乙個集中熱點。另外,從重做日誌快取寫入到重做檔案是快取寫的方式,在對重做日誌做fsync操作時,就可以釋放log_sys_mutex。通過該優化,提高了事務執行的效率

mysql innodb 引擎內幕讀書筆記1

1 mysql為單程序多執行緒的架構 2 檢視當前資料庫支援的引擎 show engines g 3 innodb的後台執行緒有7個,4個io thread,1個master thread,1個鎖,1個錯誤監控執行緒。show engine innodb status g 4 innodb 的記憶體...

MySQL技術內幕

innodb儲存引擎是事物安全的儲存引擎。innodb儲存引擎有多個記憶體塊,這些記憶體塊組成乙個很大的記憶體池,負責如下的工作 後台執行緒 innodb儲存引擎是多執行緒模型,因此他有多個不同的後台執行緒,負責處理不同的任務。記憶體日誌檔案 記錄mysql對某種條件做出響應時的檔案,如錯誤日誌檔案...

Springboot技術內幕

首先spring的技術內幕,看下springboot的啟動過程,監控springioc的呼叫過程。記錄程式執行時間 stopwatch stopwatch new stopwatch stopwatch.start collectionexceptionreporters new arraylist...