InnoDB文件物理結構解析5 - FIL_PAGE_INDEX

本文討論FIL_PAGE_INDEX頁的可回收垃圾記錄(Garbage/Deleted Records),當我們刪除某一條記錄(delete from …)時,通常InnoDB并不會在物理存儲上進行完全刪除,而是在記錄上置一個刪除標志位,我們稱這些行記錄為垃圾記錄,刪除標志位位于對應記錄的Extra Bytes中。與正常的記錄(User Records)類似,InnoDB在頁內也有一個單向鏈表將可回收垃圾記錄串在一起,用戶記錄是從Infimum Record開始,到Supremum Record結束, 而可回收垃圾記錄則是從"FIL_PAGE_INDEX"頁中的"INDEX Header"中的PAGE_FREE (First Garbage Record Offset) 開始,到最后一條垃圾數據結束(next_offset=0,指向自己)。記錄遍歷的方式都是一樣的。

sakila數據庫是MySQL官方的案例庫,這里介紹一下獲取方法,打開鏈接: https://dev.mysql.com/doc/index-other.html,然后找到"Example Databases"章節,即可獲取下載和相關文檔鏈接。

上代碼,解析Garbage Records:

/*
在數據庫中執行刪除操作:
root@localhost [sakila]> set foreign_key_checks = 0; --> 因為sakila有外鍵約束, 為了簡化刪除, 先在會話中禁用外鍵檢查;
Query OK, 0 rows affected (0.00 sec)root@localhost [sakila]> delete from sakila.film where film_id in (646, 656, 666); --> 刪除3條記錄;
Query OK, 3 rows affected (0.01 sec)
*/public class IdxPage5 {public static void main(String[] args) throws Exception {String fileName = "D:\\Data\\mysql\\8.0.18\\data\\sakila\\film.ibd";try (IbdFileParser parser = new IbdFileParser(fileName)) {// 通過上文"InnoDB文件物理結構解析4"可知,page(14)包含film_id=(565, 668)之間的數據;Page page = parser.getPage(14);// System.out.println(ParserHelper.hexDump(page.getPageRaw()));ClusteredKeyLeafPage leafPage = new ClusteredKeyLeafPage(page.getPageRaw(), page.getPageSize());List<ClusteredKeyLeafRecord> garbageRecords = leafPage.getUserRecords(IdxPage3.getFilmTableMeta());StringBuilder buff = new StringBuilder();for (ClusteredKeyLeafRecord record : garbageRecords) {List<RecordField> fields = record.getRecordFields();buff.append("\n ==> Extra: deleted = ").append(record.getDeletedFlag()).append("; next offset = ").append(record.getNextRecordOffset()).append(" <==\n");for (RecordField field : fields) {buff.append(String.format("%20s", field.getName())).append(": ").append(field.getContent()).append("\n");}}System.out.println(buff);}}
}/* 
程序執行結果:==> Extra: deleted = true; next offset = -1432 <==film_id: 666DB_TRX_ID: 00000000843cDB_ROLL_PTR: 01000001321526title: PAYCHECK WAITdescription: A Awe-Inspiring Reflection of a Boy And a Man who must Discover a Moose in The Sahara Desertrelease_year: 2006language_id: 1
original_language_id: nullrental_duration: 4rental_rate: 4.99length: 145replacement_cost: 27.99rating: PG-13special_features: [Commentaries, Deleted Scenes]last_update: 2006-02-15T05:03:42==> Extra: deleted = true; next offset = -1489 <==film_id: 656DB_TRX_ID: 00000000843cDB_ROLL_PTR: 010000013214c7title: PAPI NECKLACEdescription: A Fanciful Display of a Car And a Monkey who must Escape a Squirrel in Ancient Japanrelease_year: 2006language_id: 1
original_language_id: nullrental_duration: 3rental_rate: 0.99length: 128replacement_cost: 9.99rating: PGspecial_features: [Trailers, Deleted Scenes, Behind the Scenes]last_update: 2006-02-15T05:03:42==> Extra: deleted = true; next offset = 0 <==film_id: 646DB_TRX_ID: 00000000843cDB_ROLL_PTR: 01000001321466title: OUTBREAK DIVINEdescription: A Unbelieveable Yarn of a Database Administrator And a Woman who must Succumb a A Shark in A U-Boatrelease_year: 2006language_id: 1
original_language_id: nullrental_duration: 6rental_rate: 0.99length: 169replacement_cost: 12.99rating: NC-17special_features: [Trailers, Deleted Scenes, Behind the Scenes]last_update: 2006-02-15T05:03:42
*/

程序輸出和我們預想的一樣,記錄雖然被delete語句刪除了,但是數據還是保留在頁內的。只是Extra Bytes的delete flag被置為true,最后一條被刪除的記錄指向的不是"Supremum Record",而是自己(next offset = 0)。

案例中獲取刪除數據用到了ClusteredKeyLeafPage的getGarbageRecords()方法,與獲取普通用戶記錄的getUserRecords()方法的唯一不同是遍歷記錄的開始位置不同:

public class ClusteredKeyLeafPage {public List<ClusteredKeyLeafRecord> getUserRecords(TableMeta tableMeta) {int pos = getSystemRecords().getInfimumNextRecordPos(); return iterateRecordInPage(tableMeta, pos);}public List<ClusteredKeyLeafRecord> getGarbageRecords(TableMeta tableMeta) {int pos = getIndexHeader().getFirstGarbageOffset();return iterateRecordInPage(tableMeta, pos);}private List<ClusteredKeyLeafRecord> iterateRecordInPage(TableMeta tableMeta, int firstRecordPos) {//...// 遍歷結束的條件if (recCount > maxRecs || nextOffset == 0 || nextRecord == SUPREMUM_EXTRA_END_POS) {break;}//}
}	

更多測試情況:

  • 如果執行的是"truncate sakila.film",該方法是無效的,因為整個ibd文件的存儲空間會被"重置"(文件會變小,沒有page(14)),全表刪除(“delete from sakila.film”)通常不會,但也有特例,當一個表的數據量非常小(索引深度小于1),所有的行都在一個(Leaf) Page時,觀察到全表刪除和truncate一樣,整個頁的記錄數據會被清掉(置為00),可以通過hexdump確認。

  • 在刪除整個頁內的記錄時,記錄雖然不會被清掉,但觀察到會有部分刪除記錄在User Record鏈表內的情況。

最后,介紹一個通過hexdump命令查看某個頁內容的方法:

# 假設我們要看page(4),Page的大小為16KB(16384字節);
# 那么page(4)的起始位置為 4 * 16384=65536,讀取長度為16384;
# 所以命令hexdump的命令為:
[think@TP-T470 sakila]$ hexdump --skip 65536 --length 16384 -C -v film2.ibd

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36402.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36402.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36402.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式Qt開發—Excel表格數據導出

有一個嵌入式Excel表格數據導出的需求&#xff1a;應用軟件運行于嵌入式Linux平臺上&#xff0c;在設備運行過程中&#xff0c;存儲了許多數據&#xff0c;這些數據想以表格的形式導出。考慮到Windows平臺的普遍性&#xff0c;需要將數據以excel表格形式導出&#xff0c;故選擇…

python庫打包

一、背景 想讓自己寫的python庫可以使用pip install xxx安裝。 二、環境準備 注冊PYPI賬號已經寫好的能正常使用的庫/方法/項目&#xff08;可以本地調用&#xff09;安裝依賴庫setuptools和twinw pip install setuptools pip install twine # 簡化將庫發布到PYPI流程的工…

“中國軟件杯”飛槳賽道晉級決賽現場名單公布

“中國軟件杯”大學生軟件設計大賽是由國家工業和信息化部、教育部、江蘇省人民政府共同主辦&#xff0c;是全國軟件行業規格最高、最具影響力的國家級一類賽事&#xff0c;為《全國普通高校競賽排行榜》榜單內賽事。今年&#xff0c;組委會聯合百度飛槳共同設立了“智能系統設…

C++11之后的C++標準特性宏定義方便功能特性測試

C是一個龐大的編程語言體系&#xff0c;它的高效性是可以直接連接硬件系統&#xff0c;它的靈活性是不斷迭代完善的通用語義機制&#xff0c;當下C的發展演進可謂一路狂奔。不同應用中需要知道C對應的平臺或者版本的功能特性&#xff0c;標準庫信息、C編譯器特性等&#xff0c;…

基于PHP的輕量級博客typecho

本文完成于 5 月中旬&#xff0c;發布時未在最新版本上驗證&#xff1b; 什么是 typecho &#xff1f; Typecho 是一款基于 PHP 的博客軟件&#xff0c;旨在成為世界上最強大的博客引擎。Typecho 在 GNU 通用公共許可證 2.0 下發布。支持多種數據庫&#xff0c;原生支持 Markdo…

24屆近5年南京大學自動化考研院校分析

今天給大家帶來的是南京大學控制考研分析 滿滿干貨&#xff5e;還不快快點贊收藏 一、南京大學 學校簡介 南京大學是一所歷史悠久、聲譽卓著的高等學府。其前身是創建于1902年的三江師范學堂&#xff0c;此后歷經兩江師范學堂、南京高等師范學校、國立東南大學、國立第四中…

JS 刪除的是最后一頁的最后一條,頁碼設置邏輯

刪除的場景&#xff1a; 解決思路&#xff1a; 1、計算操作后的總頁數 2、刪除成功之后的總頁數與當前總頁數進行比較 3、如果刪除成功之后的總頁數比小于當前總頁數&#xff0c;需要把當前頁碼減去1&#xff1b;否則&#xff0c;直接進行列表數據的請求 代碼實現 /*總條數…

VBA 學習筆記1 對象以及屬性

目錄 1 取得VBA對象1.1 取得工作簿對象1.2 取得工作表對象1.3 取得單元格對象1.4 取得對象的屬性1.5 文檔的方法1 進入vba 界面 方式之一&#xff1a; 快捷鍵&#xff1a;ALTERF11 運行方式之一&#xff1a; 進入vba界面&#xff0c;點擊綠色三角符號 1 取得VBA對象 1.1 取得…

DAY21

題目一 給定三個字符串str1、str2和aim&#xff0c; 如果aim包含且僅包含來自str1和str2的所有字符&#xff0c;而且在aim中屬于str1的字符 之間保持原來在str1中的順序&#xff0c;屬于str2的字符之間保持原來在str2中的順序&#xff0c;那么稱aim是str1和str2的交錯組成。實…

Springboot-Retrofit HTTP工具框架快速使用

在SpringBoot項目直接使用okhttp、httpClient或者RestTemplate發起HTTP請求&#xff0c;既繁瑣又不方便統一管理。 因此&#xff0c;在這里推薦一個適用于SpringBoot項目的輕量級HTTP客戶端框架retrofit-spring-boot-starter&#xff0c;使用非常簡單方便&#xff0c;同時又提供…

約數個數(質因子分解)

思路&#xff1a; &#xff08;1&#xff09;由數論基本定理&#xff0c;任何一個正整數x都能寫作&#xff0c;其中p1,p2..pk為x的質因子。 &#xff08;2&#xff09;由此可以推斷&#xff0c;要求一個數約數的個數&#xff0c;注意到約數就是p1,p2...pk的一種組合&#xff…

日常BUG—— SpringBoot項目DEBUG模式啟動慢、卡死。

&#x1f61c;作 者&#xff1a;是江迪呀??本文關鍵詞&#xff1a;日常BUG、BUG、問題分析??每日 一言 &#xff1a;存在錯誤說明你在進步&#xff01; 一、問題描述 我們調試程序時&#xff0c;需要使用DEBUG模式啟動SpringBoot項目&#xff0c; 有時候會發…

convert Auto-Login (cwallet.sso) Wallet into a PKCS12 compliant Wallet

一步不行嗎 &#xff1f; 1. If $JAVA_HOME is not set: a)For FMW 11g components associated with a WebLogic Domain or a FMW 12c Collocated OHS install run: $MIDDLEWARE_HOME/user_projects/domains/<domain>/bin/setDomainEnv.sh b) For FMW 11g Standalone…

側滑置頂,取消置頂

第一步:布局 <?xml version"1.0" encoding"utf-8"?> <com.ddmh.magic.camera.ui.widget.SwipeMenuLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…

SQL | 使用通配符進行過濾

6-使用通配符進行過濾 6.1-LIKE操作符 前面介紹的所有操作符都是通過已知的值進行過濾&#xff0c;或者檢查某個范圍的值。但是如果我們想要查找產品名字中含有bag的數據&#xff0c;就不能使用前面那種過濾情況。 利用通配符&#xff0c;可以創建比較特定數據的搜索模式。 …

selenium 爬蟲

selenium 可以動態爬取網頁數據&#xff0c;就像真實用戶操作瀏覽器一樣&#xff0c;從終端用戶的角度測試應用程序&#xff0c;WebDriver通過原生瀏覽器支持或者瀏覽器擴展直接控制瀏覽器 webdriver下載 因為selenuim對瀏覽器的版本存在兼容問題&#xff0c;顧需要針對指定瀏…

SAP系統是什么呢?它有哪些優勢?

SAP系統是全球知名的企業資源規劃&#xff08;ERP&#xff09;解決方案供應商。它集成了財務、供應鏈管理、人力資源管理、銷售和客戶關系管理等多個功能模塊&#xff0c;為企業提供全面、集成的管理體驗。SAP系統已成為各行各業企業管理的智慧選擇&#xff0c;極大地提升了管理…

c++ 有元

友元分為兩部分內容 友元函數友元類 友元函數 問題&#xff1a;當我們嘗試去重載operator<<&#xff0c;然后發現沒辦法將operator<<重載成成員函數。因為cout的輸出流對象和隱含的this指針在搶占第一個參數的位置。this指針默認是第一個參數也就是左操作 數了。…

如何在vue3中加入markdown語法

1、首先需要安裝 md-editor-v3 yarn add md-editor-v3 或者是在vue圖形化界面中直接搜索 md-editor-v3 進行安裝。 2、引入該編輯頁 引入可以參考這個&#xff0c;根據自己的需求進行修改和添加。 <template><md-editor v-model"text"/> </templat…

基于dbn+svr的交通流量預測,dbn詳細原理

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) DBN+SVR的交通流量預測 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類算法,本文將DBN+SVR用于交通流量預測…