導讀:
? 根據前面的所學知識,我們知道了InnoDB存儲引擎存儲數據的數據結構、存儲過程,而被組織好的數據則被存儲在操作系統的磁盤上,當我們在對表數據進行增刪改查時,其實就是InnoDB存儲引擎與磁盤的交互。
? 此外,操作系統中對磁盤的管理歸屬于文件系統,所以我們也可將數據增刪改查的過程稱為是InnoDB存儲引擎與文件系統的交互。之前我們只是通過工具對數據庫中的數據進行操作,并沒有真正看到過數據庫、表等存儲文件,接下來我們就來了解一下在文件系統中,MySQL是以什么樣的形式對數據進行的存儲?保存了哪些數據?…
一、數據目錄
? MySQL服務器程序在啟動時會在文件系統的某個目錄下加載一些文件,之后在運行過程中產生的數據也都會存儲到這個目錄下的某些文件中,這個目錄就稱為數據目錄。
注:數據目錄是用來存儲MySQL運行過程中產生的數據,和安裝目錄不同,一定要區分開。
? 數據目錄對應的系統變量為 datadir,我們可以通過以下語句查詢自己本地計算機的數據目錄路徑:
二、數據目錄的結構
? MySQL運行過程中的產生的數據庫、表、視圖、觸發器等用戶數據都會被存儲到數據目錄下,此外還有一些其本身所攜帶的數據。
1、數據庫
? 在創建數據庫時,在文件系統中會產生如下變化:
- 在數據目錄下,創建一個和數據庫名同名的文件夾。
- 在創建的數據庫同名文件夾下創建一個名為 db.opt 的文件,這個文件中包含了該數據庫的各種屬性,比方說該數據庫的字符集和比較規則是個啥。
? 以下是我本地創建的一個 blog 數據庫的存儲形式:
2、表
? 文件系統中存儲的表數據分為兩部分:
- 表結構:用于存儲表的基本屬性,比如表名、字符集、比較規則等,文件名以".frm"為后綴。
- 表數據:InnoDB以數據頁為基本單位組織、存儲數據,為了更好的管理這些頁,設計InnoDB的大叔們提出了一個表空間或者文件空間(英文名:table space 或者 file space)的概念,這個表空間是一個抽象的概念,它可以對應文件系統上一個或多個真實文件(不同表空間對應的文件數量可能不同)。每一個表空間可以被劃分為很多很多很多個頁,我們的表數據就存放在某個表空間下的某些頁里。設計InnoDB的大叔將表空間劃分為幾種不同的類型:
- 系統表空間(system tablespace):從 MySQL5.5.7 到 MySQL5.6.6 之間的各個版本中,MySQL表中的數據都會被默認存儲到這個系統表空間。
- 獨立表空間(file-per-table tablespace):在 MySQL5.6.6 以及之后的版本中,InnoDB并不會默認的把各個表的數據存儲到系統表空間中,而是為每一個表建立一個獨立表空間,也就是說我們創建了多少個表,就有多少個獨立表空間。
?注1:系統表空間可以對應文件系統上一個或多個實際的文件,默認情況下,InnoDB會在數據目錄下創建一個名為ibdata1、大小為12M的自擴展文件。
注2:每個表的獨立表空間被存儲在數據目錄下同名數據庫文件夾下,文件名與表名一致,以".ibd"為后綴。
3、視圖
? MySQL中的視圖其實是虛擬的表,也就是某個查詢語句的一個別名而已,所以在存儲視圖的時候是不需要存儲真實的數據的,只需要把它的結構存儲起來就行了。和表一樣,描述視圖結構的文件也會被存儲到所屬數據庫對應的子目錄下邊,只會存儲一個視圖名.frm的文件。
4、其他文件
除了上述用戶數據外,數據目錄下還包括為了更好運行程序的一些額外文件,主要包括這幾種類型的文件:
- 服務器進程文件:我們知道每運行一個MySQL服務器程序,都意味著啟動一個進程。MySQL服務器會把自己的進程ID寫入到一個文件中。
- 服務器日志文件:在服務器運行過程中,會產生各種各樣的日志,比如常規的查詢日志、錯誤日志、二進制日志、redo日志等。
- 默認/自動生成的SSL和RSA證書和密鑰文件:主要是為了客戶端和服務器安全通信而創建的一些文件。