mysql存入mtr資料 MySQL中MTR的概念

2021-10-17 20:27:30 字數 1282 閱讀 1367

mtr全稱是mini-transaction,顧名思義,可以理解為"最小的事務",mysql中把對底層頁面的一次原子訪問的過程稱之為乙個mini-transaction,這裡的原子操作,指的是要麼全部成功,要麼全部失敗,不存在中間狀態。

mtr主要是被用在寫undo log和redo log的場景下的。例如,我們要向乙個b+樹索引中插入一條記錄,此時要麼插入成功,要麼插入失敗,這個過程就可以稱為乙個mtr過程,這個過程中會產生一組redo log日誌,這組日誌在做mysql的崩潰恢復的時候,是乙個不可分割的整體。

假如我們有乙個事務,事務中包含3條語句,那麼mtr的概念圖如下:

mini-transaction一般遵循三條原則:

1、the fix rules

2、wal

3、force-log-at-commit

這裡我們解釋下這三條原則:

1、the fix rules

解釋第一條規則之前,我們有必要了解下mysql中的latch的概念,在mysql中,latch是一種輕量級的鎖,與lock不同,它鎖定的時間特別短,在innodb中,latch又可以分為mutex(互斥量)和rwlock(讀寫鎖)2種,它的目的在於保證併發執行緒操作臨界資源的正確性。

理解了latch的概念,我們看看the fix rule規則:

修改乙個資料頁,需要獲得這個資料頁的x-latch;

訪問乙個頁是需要獲得s-latch或者x-latch;

持有該頁的latch直到修改或者訪問該頁的操作完成才釋放

2、wal

wal技術想必大家比較熟悉,它是innodb儲存引擎之所以支援崩潰恢復的根本,也就是持久化乙個資料頁之前,需要將記憶體中響應的日誌頁先持久化

3、force-log-at-commit

這條原則比較重要,它是指在事務提交的時候,其產生的所有mtr日誌都要刷到持久化裝置中,從而保證崩潰恢復的邏輯。

之所以介紹mtr,是為了後續介紹mysql8.0的redo log 優化做準備,在mysql5.7中,mtr保證了事務內部操作的原子性。當使用者進行操作的時候,會更新資料頁,同時寫redo log,mtr是redo log的載體,存在每個連線會話的私有變數中。當mtr提交時,會將本地redo log拷貝到全域性的log_buffer中,為了保證redo log的有序性,需要加鎖來訪問log_buffer,這把鎖就是上面提到的mutex,在這個鎖保護下,除了要將本地日誌拷貝到全域性buffer,還需要將資料頁加入了flush_list,供後台執行緒刷髒,輔助資料庫檢查點持續往前推進,所以這個鎖在舊版本的mysql中競爭非常激烈。mysql8.0將這個問題進行了優化,後面的文章中將著重分析。

Python讀入Excel資料存入MySQL

import xlrd import pymysql from datetime import datetime from xlrd import xldate as tuple 開啟資料所在的工作簿,以及選擇存有資料的工作表 book xlrd.open workbook 測試表.xls shee...

資料存入mysql 計數資料存入Mysql

引用dll mysql.data.dll 建乙個資料連線靜態類 public static class mysql public static string constr database test password 密碼 user id root server ip位址 public static...

php將json格式的資料直接存入mysql資料庫

直接使用php函式json encode,資料存入mysql時會報錯 php imgs str json encode imgs array imgs str addslashes imgs str update query updatearticleset imagelist imgs str w...