深入理解InnoDB(5)-文件系统
1. 數(shù)據(jù)庫和文件系統(tǒng)的關(guān)系
像 InnoDB 、 MyISAM 這樣的存儲引擎都是把表存儲在文件系統(tǒng)上的。當(dāng)我們想讀取數(shù)據(jù)的時候,這些存儲引擎會從文件系統(tǒng)中把數(shù)據(jù)讀出來返回給我們,當(dāng)我們想寫入數(shù)據(jù)的時候,這些存儲引擎會把這些數(shù)據(jù)又寫回文件系統(tǒng)。
2.MySQL數(shù)據(jù)目錄
區(qū)別于MySQL安裝目錄(安裝目錄存儲了許多控制服務(wù)器和客戶端程序的命令),數(shù)據(jù)目錄是用來存儲MySQL在運行過程中產(chǎn)生的數(shù)據(jù)
2.1 查找MySQL數(shù)據(jù)目錄的位置
因為數(shù)據(jù)目錄是記錄在系統(tǒng)變量’datadir’中的,因此直接輸入命令就在找到
mysql> SHOW VARIABLES LIKE 'datadir';2.2 數(shù)據(jù)目錄的結(jié)構(gòu)
已知數(shù)據(jù)目錄位置,我們創(chuàng)建的數(shù)據(jù)庫就會在該文件夾下面生成一個同名子目錄,并在這個子目錄下創(chuàng)建一個名為db.opt的文件,這個文件包含該數(shù)據(jù)庫的各種屬性,如字符集/比較規(guī)則等
如下圖為數(shù)據(jù)庫tcc—cap目錄下的內(nèi)容,它包含表結(jié)構(gòu)的定義和表數(shù)據(jù)
2.3 文件系統(tǒng)中InnoDB表的表示
對于 InnoDB 存儲引擎的數(shù)據(jù)表,一個表對應(yīng)兩個文件,一個是 *.frm,存儲表結(jié)構(gòu)信息;一個是 *.ibd,存儲表中數(shù)據(jù)。
2.4 存儲表數(shù)據(jù)
InnoDB中的數(shù)據(jù)是以頁為基本單位的,為了更好的管理這些頁,MySQL引入了表空間,它可以對應(yīng)文件系統(tǒng)上一個或多個真實文件。每一個表空間可以被劃分為很多很多很多個頁,我們的表數(shù)據(jù)就存放在某個表空間下的某些頁里。
2.4.1 系統(tǒng)表空間
默認情況下,InnoDB會在數(shù)據(jù)目錄下創(chuàng)建一個名為ibdata1、大小為12M的文件,這個文件就是對應(yīng)的系統(tǒng)表空間在文件系統(tǒng)上的表示。
在一個MySQL服務(wù)器中,系統(tǒng)表空間只有一份。從MySQL5.5.7到MySQL5.6.6之間的各個版本中,我們表中的數(shù)據(jù)都會被默認存儲到這個 系統(tǒng)表空間。
2.4.2 獨立表空間
在MySQL5.6.6以及之后的版本中,InnoDB并不會默認的把各個表的數(shù)據(jù)存儲到系統(tǒng)表空間中,而是為每一個表建立一個獨立表空間,也就是說我們創(chuàng)建了多少個表,就有多少個獨立表空間。使用獨立表空間來存儲表數(shù)據(jù)的話,會在該表所屬數(shù)據(jù)庫對應(yīng)的子目錄下創(chuàng)建一個表示該獨立表空間的文件,文件名和表名相同,只不過添加了一個.ibd的擴展名而已
2.5 文件系統(tǒng)中MyISAM表的表示
因為該存儲引擎的數(shù)據(jù)和索引是分開存放的。所以在文件系統(tǒng)中也是使用不同的文件來存儲數(shù)據(jù)文件和索引文件。而且和InnoDB不同的是,MyISAM并沒有什么所謂的表空間一說,表數(shù)據(jù)都存放到對應(yīng)的數(shù)據(jù)庫子目錄下。
因此在構(gòu)成上,MyISAM需要比innoDB多一個文件,并且文件的后綴名也與innoDB存在區(qū)別:
- test.frm
- test.MYD
- test.MYI
2.6 文件系統(tǒng)中視圖的表示
因為視圖實際上是一種虛擬的表,并沒有實際數(shù)據(jù)的存在,因此只需要用一個*.frm文件存儲在對應(yīng)的數(shù)據(jù)庫子目錄即可。
2.7 數(shù)據(jù)目錄下的其他的文件
- 服務(wù)器進程文件。
我們知道每運行一個MySQL服務(wù)器程序,都意味著啟動一個進程。MySQL服務(wù)器會把自己的進程ID寫入到一個文件中。
- 服務(wù)器日志文件。
在服務(wù)器運行過程中,會產(chǎn)生各種各樣的日志,也需要被存儲。
- 默認/自動生成的SSL和RSA證書和密鑰文件。
3.文件系統(tǒng)對數(shù)據(jù)庫的影響
- 文件名長度的影響
數(shù)據(jù)庫產(chǎn)生的文件,文件名受限于文件系統(tǒng)支持的最大長度 - 文件大小的影響
對于數(shù)據(jù)庫中的文件,它們受限于文件系統(tǒng)所支持的最大文件大小 - 特殊字符的影響
為了避免因為數(shù)據(jù)庫名和表名出現(xiàn)某些特殊字符而造成文件系統(tǒng)不支持的情況,MySQL會把數(shù)據(jù)庫名和表名中所有除數(shù)字和拉丁字母以外的所有字符在文件名里都映射成 @+編碼值的形式作為文件名。
4.MySQL系統(tǒng)數(shù)據(jù)庫
MySQL會默認存在幾個系統(tǒng)數(shù)據(jù)庫
- information_schema提供了訪問數(shù)據(jù)庫元數(shù)據(jù)的方式。(元數(shù)據(jù)是關(guān)于數(shù)據(jù)的數(shù)據(jù),如數(shù)據(jù)庫名或表名,列的數(shù)據(jù)類型,或訪問權(quán)限等。有時用于表述該信息的其他術(shù)語包括“數(shù)據(jù)詞典”和“系統(tǒng)目錄”。)
- 換句換說,information_schema是一個信息數(shù)據(jù)庫,它保存著關(guān)于MySQL服務(wù)器所維護的所有其他數(shù)據(jù)庫的信息。(如數(shù)據(jù)庫名,數(shù)據(jù)庫的表,表欄的數(shù)據(jù)類型與訪問權(quán) 限等。) 在INFORMATION_SCHEMA中,有幾張只讀表。它們實際上是視圖,而不是基本表。
- 查看具體表:
- mysql的核心數(shù)據(jù)庫,類似于sql server中的master表,主要負責(zé)存儲數(shù)據(jù)庫的用戶、權(quán)限設(shè)置、關(guān)鍵字等mysql自己需要使用的控制和管理信息。(常用的,在mysql.user表中修改root用戶的密碼)。
- 主要用于收集數(shù)據(jù)庫服務(wù)器性能參數(shù)。并且?guī)炖锉淼拇鎯σ婢鶠镻ERFORMANCE_SCHEMA,而用戶是不能創(chuàng)建存儲引擎為PERFORMANCE_SCHEMA的表。MySQL5.7默認是開啟的。
- Sys庫所有的數(shù)據(jù)源來自:performance_schema。目標(biāo)是把performance_schema的把復(fù)雜度降低,讓DBA能更好的閱讀這個庫里的內(nèi)容。讓DBA更快的了解DB的運行情況。
總結(jié)
以上是生活随笔為你收集整理的深入理解InnoDB(5)-文件系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到吃馒头是什么预兆
- 下一篇: 深入理解InnoDB(7)—系统表空间