3.5 表結構定義檔案
MySQL 都有一個以frm為后綴的檔案,該檔案記錄了該表的表結構定義,
frm還用來存放視圖的定義,如用戶創建了一個v_a 視圖,那么對應會產生一個v_a.frm 檔案,用來記錄視圖的定義,該檔案是文本檔案,可用cat查看,
3.6 InnoDB存盤引擎檔案
InnoDB檔案包括重做檔案、表空間檔案,
3.6.1 表空間檔案
InnoDB采用將存盤的資料按表空間進行存放的設計,在默認配置下,會有一個初始大小為10MB,名為ibdata1的檔案,該檔案就是默認的表空間檔案,用戶也可以通過多個檔案組成一個表空間,同時制定檔案的屬性,
設定innodb_data_file_path引數后,所有基于innoDB 存盤引擎的表的資料都會記錄到該共享表空間,若設定了引數 innodb_file_per_table = ON 則用戶可以將每個基于INnoDB的表產生一個獨立表空間,獨立表空間的命名規則為:表名.ibd.
這些單獨的表空間檔案僅存盤該表的資料、索引和插入緩沖bitmap等資訊,其余資訊還是存放在默認的表空間中,

3.6.2 重做日志檔案
默認情況下,在innoDB 存盤引擎的資料目錄下會有兩個名為 ib_logfile0 和 ib_logfile1 的檔案,在MySQL 官方手冊中稱為 InnoDB 存盤引擎的日志檔案,不過更準確的說是重做日志檔案,他們記錄了對于 InnoDB 存盤引擎的事務日志,
當實體或介質失敗時,重做日志檔案就能派上用場了,例如,資料庫由于在主機掉電導致實體失敗,InnoDB會使用重做日志恢復到掉電前的時刻,以次保證資料的完整性,
每個InnoDB存盤引擎至少有一個重做日志檔案組,每個檔案組至少有兩個重做日志檔案,例如默認的 ib_logfile0和 ib_logfile1,用戶可自行設定更多的鏡像日志組,將不同的檔案組放到不同的磁盤上,提供重做日志的可用性,在日志組中,每個重做日志檔案的大小一致,并以回圈寫入的方式運行,InnoDB會先寫重做日志檔案1,當達到檔案的最后,會切換到重做日志檔案2,再當2被寫滿時,會再切換到檔案1.
重做日志檔案的大小設定對InnoDB的性能有很大影響,一方面重做日志檔案不能設定太大,如果太大,在恢復時可能需要很長時間,另一方面,設定太小,可能導致一個事務需要多次切換重做日志檔案,此外,重做日志檔案太小會導致頻繁的發生 async Checkpoint,導致性能抖動,
重做日志有一個 capacity 變數,該值代表了最后的檢查點不能超過這個閾值,如果超過這個閾值,則必須將緩沖池(InnoDB buffer pool)中的臟頁串列中的部分臟資料協會磁盤,這時會導致用戶執行緒的阻塞,
之前介紹過,寫入重做日志檔案的操作不是直接寫,而是先寫入重做日志緩沖(redo log buffer),然后按照一定的順序寫入日志檔案,

上圖展示了重做日志的寫入程序,從重做日志緩沖往磁盤寫入時,是按照 512 個位元組,也就是一個扇區的大小進行寫入,因為扇區是寫入的最小單位,因此可以保證寫入必定是成功的,因此重做日志的寫入程序不需要有 doublewrite,之前提到過,在主執行緒中每秒會將重做日志檔案緩沖寫入磁盤的重做日志檔案中,不論事務是否已經提交,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/56214.html
標籤:MySQL
