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