第02章_MySQL的數據目錄
1. MySQL8的主要目錄結構
?1.1 數據庫文件的存放路徑
MySQL數據庫文件的存放路徑:/var/lib/mysql/
MySQL服務器程序在啟動時會到文件系統的某個目錄下加載一些文件,之后在運行過程中產生的數據也都會存儲到這個目錄下的某些文件中,這個目錄就稱為數據目錄。
MySQL把數據都存到哪個路徑下呢?其實數據目錄對應著一個系統變量datadir,我們在使用客戶端與服務器建立連接之后查看這個系統變量的值就可以了:
show variables like 'datadir';
從結果中可以看出,在我的計算機上MysQL的數據目錄就是/var/lib/mysql/。
1.2相關命令目錄
相關命令目錄:/usr/bin(mysqladmin、mysqlbinlog、mysqldump等命令)和/usr/sbin。?
比如你 cd /usr/sbin,用ls看一下,同樣非常多。
1.3 配置文件目錄
配置文件目錄: /usr/share/mysql-8.0(命令及配置文件),/etc/mysql(如my.cnf)
?2.數據庫和文件系統的關系
像InnoDB、MyISAM這樣的存儲引擎都是把表存儲在磁盤上的,操作系統用來管理磁盤的結構被稱為文件系統,所以用專業一點的話來表述就是:像InnoDB、MyISAM這樣的存儲引擎都是把表存儲在文件系統上的。當我們想讀取數據的時候,這些存儲引擎會從文件系統中把數據讀出來返回給我們,當我們想寫入數據的時候,這些存儲引擎會把這些數據又寫回文件系統。本章學習一下InnoDB和MyISAM這兩個存儲引擎的數據如何在文件系統中存儲。
查看一下在我的計算機上當前有哪些數據庫:
mysql> SHOW DATABASES;
可以看到有4個數據庫是屬于MySQL自帶的系統數據庫。
- mysql
MySQL系統自帶的核心數據庫,它存儲了MySQL的用戶賬戶和權限信息,一些存儲過程、事件的定義信息,一些運行過程中產生的日志信息,一些幫助信息以及時區信息等。 - information_schema
MySQL系統自帶的數據庫,這個數據庫保存著MySQL服務器維護的所有其他數據庫的信息,比如有哪些表、哪些視圖、哪些觸發器、哪些列、哪些索引。這些信息并不是真實的用戶數據,而是一些描述性信息,有時候也稱之為元數據。在系統數據庫information_schema中提供了一些以innodb_sys開頭的表,用于表示內部系統表。 - performance_schema
MySQL系統自帶的數據庫,這個數據庫里主要保存MySQ服務器運行過程中的一些狀態信息,可以用來監控MySQL服務的各類性能指標。包括統計最近執行了哪些語句,在執行過程的每個階段都花費了多長時間,內存的使用情況等信息。 - sys
MySQL系統自帶的數據庫,這個數據庫主要是通過視圖的形式把information_schema和
performance_schema結合起來,幫助系統管理員和開發人員監控MysQL的技術性能。
?Innodb分為5.7和8.0兩個版本,MyISAM單個就好
?我們cd ./debest1? ?在一個表中,ll 后發現有兩個文件emp1和emp2,打開文件對應的是五個,分別是db.opt,emp1.frm,emp1.ibd,emp2.frm,emp2.ibd
.frm存儲表結構 .ibd存儲表數據
?打開8.0,相同的操作,但是是只有2個文件,emp1.ibd和mytbl2.ibd?
其中中括號擴起來的 = 可有可無,比如:我們想把 test 表從獨立表空間移動到系統表空間,可以這么寫:
ALTER TABLE test TABLESPACE innodb_system;
④ 其他類型的表空間
隨著MySQL的發展,除了上述兩種老牌表空間之外,現在還新提出了一些不同類型的表空間,比如通用表空間(general tablespace)、臨時表空間(temporary tablespace)等。
3. 疑問
.frm在MySQL8中不存在了。那去哪里了呢?
這就需要解析ibd文件。Oracle 官方將frm文件的信息及更多信息移動到叫做序列化字典信息(Serialized Dictionary Information,SDI),SDI被寫在ibd文件內部。MySQL 8.0屬于Oracle旗下,同理。
為了從IBD文件中提取SDI信息,Oracle提供了一個應用程序 ibd2sdi。
=== ibd2sdi 官方文檔 ===
這個工具不需要下載,MySQL8自帶的有,只要你配好環境變量就能到處用。
(1)查看表結構
到存儲ibd文件的目錄下,執行下面的命令:
ibd2sdi --dump-file=student.txt student.ibd
結果如圖所示
[root@bgon atguigu]# ibd2sdi --dump-file=student.txt student.ibd
[root@bgon atguigu]# ls
a.ibd student.ibd student.txt test_frm.ibd
2.3.1 InnoDB存儲引擎模式
1. 表結構
為了保存表結構,InnoDB在數據目錄下對應的數據庫子目錄下創建了一個專門用于描述表結構的文件,文件名是這樣:
表名.frm
比方說我們在 atguigu 數據庫下創建一個名為 test 的表:
mysql> USE atguigu;
Database changedmysql> CREATE TABLE test (c1 INT
);
Query OK, 0 rows affected (0.03 sec)
那在數據庫 atguigu 對應的子目錄下就會創建一個名為 test.frm 的用于描述表結構的文件。.frm文件的格式在不同的平臺上都是相同的。這個后綴名為.frm是以二進制格式存儲的,我們直接打開是亂碼的。
2. 表中數據和索引
系統表空間(system tablespace)
默認情況下,InnoDB會在數據目錄下創建一個名為 ibdata1、大小為 12M 的文件,這個文件就是對應的系統表空間在文件系統上的表示。怎么才12M?注意這個文件是自擴展文件,當不夠用的時候它會自己增加文件大小。
當然,如果你想讓系統表空間對應文件系統上多個實際文件,或者僅僅覺得原來的 ibdata1 這個文件名難聽,那可以在MySQL啟動時配置對應的文件路徑以及它們的大小,比如我們這樣修改一下my.cnf 配置文件:
[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend
獨立表空間(file-per-table tablespace)
在MySQL5.6以及之后的版本中,InnoDB并不會默認的把各個表的數據存儲到系統表空間中,而是為每個表建立一個獨立表空間,也就是說我們創建了多少個表,就有多少個獨立表空間。使用獨立表空間來存儲表數據的話,會在該表所屬數據庫對應的子目錄下創建一個表示該獨立表空間的文件,文件名和表名相同,只不過添加了一個.ibd的擴展名而已,所以完整的文件名稱長這樣:
表名.ibd
比如:我們使用了獨立表空間去存儲 atguigu 數據庫下的 test 表的話,那么在該表所在數據庫對應的 atguigu 目錄下會為 test 表創建這兩個文件:
test.frm
test.ibd
其中 test.ibd 文件就用來存儲 test 表中的數據和索引。
系統表空間與獨立表空間的設置
我們可以自己指定使用系統表空間還是獨立表空間來存儲數據,這個功能由啟動參數 innodb_file_per_table 控制,比如說我們想刻意將表數據都存儲到系統表空間時,可以在啟動 MySQL 服務器的時候這樣配置:
[server]
innodb_file_per_table=0 # 0: 代表使用系統表空間; 1: 代表使用獨立表空間
默認情況:
mysql> show variables like 'innodb_file_per_table';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| innodb_file_per_table | ON |
+----------------+-------+
1 row in set (0.01 sec)
其他類型的表空間
隨著MySQL的發展,除了上述兩種老牌表空間之外,現在還新提出了一些不同類型的表空間,比如通用表空間(general tablespace)、臨時表空間(temporary tablespace)等。
?2.3.2 MyISAM存儲引擎模式
?在存儲表結構方面, MyISAM 和 InnoDB 一樣,也是在 數據目錄下對應的數據庫子目錄下創建了一個專門用于描述表結構的文件: 表名.frm
在MyISAM中的索引全部都是 二級索引,該存儲引擎的 數據和索引是分開存放的。所以在文件系統中也是 使用不同的文件來存儲數據文件和索引文件,同時表數據都存放在對應的數據庫子目錄下。假如 表使用MyISAM存儲引擎的話,那么在它所在數據庫對應的 atguigu 目錄下會為 test test 表創建這三個文件:
test.frm ? 存儲表結構
test.MYD ? 存儲數據 (MYData)
test.MYI ? 存儲索引 (MYIndex)
?舉例:創建一個 MyISAM 表,使用 ENGINE 選項顯式指定引擎。因為InnoDB是默認引擎。
CREATE TABLE `student_myisam` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(64) DEFAULT NULL,`age` int DEFAULT NULL,`sex` varchar(2) DEFAULT NULL,PRIMARY KEY (`id`))ENGINE=MYISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb3;
2.4 小結
舉例:數據庫a,表b。
1、如果表b采用 InnoDB,data\a中會產生1個或者2個文件:
- b.frm:描述表結構文件,字段長度等
- 如果采用 系統表空間 模式的,數據信息和索引信息都存儲在 ibdata1 中
- 如果采用 獨立表空間 存儲模式,data\a中還會產生 b.ibd 文件(存儲數據信息和索引信息)
此外:
① MySQL5.7 中會在 data/a 的目錄下生成 db.opt 文件用于保存數據庫的相關配置。比如:字符集、比較規則。而 MySQL8.0 不再提供 db.opt 文件。
② MySQL8.0 中不再單獨提供 b.frm,而是合并在 b.ibd 文件中。
2、如果表b采用 MyISAM,data\a中會產生3個文件:
- MySQL5.7 中:b.frm:描述表結構文件,字段長度等。
- MySQL8.0 中 b.xxx.sdi:描述表結構文件,字段長度等
- b.MYD (MYData):數據信息文件,存儲數據信息(如果采用獨立表存儲模式)
- b.MYI (MYIndex):存放索引信息文件
?2.5視圖在文件系統中的表示
我們知道MySQL中的視圖其實是虛擬的表,也就是某個查詢語句的一個別名而已,所以在存儲視圖的時候是不需要存儲真實的數據的,只需要把它的結構存儲起來就行了。和表一樣,描述視圖結構的文件也會被存儲到所屬數據庫對應的子目錄下邊,只會存儲一個視圖名.frm的文件。如下圖中的:emp_details_view.frm
?
?