1. MySQL8 的主要目錄結構
[root@atguigu01 ~]
# find / -name mysql

/var/lib/mysql/
mysql
>show
variables
like'datadir'
;
+---------------+-----------------+
|
Variable_name
|Value|
+---------------+-----------------+
|
datadir
|/
var
/
lib
/
mysql
/|
+---------------+-----------------+
1rowinset
(
0.02
sec)
mysql
>
從結果中可以看出,在我的計算機上MySQL的資料目錄就是/var/lib/mysql/
。
1.1 相關命令目錄

1.2 配置檔案目錄
[root@RainbowSea ~]
# cd /usr/share/mysql-8.0/

2. 資料庫和檔案系統的關係
2.1 檢視預設資料庫
mysql
>SHOW
DATABASES;

-
mysql
-
information_schema
維護的所有其他資料庫的資訊
元資料
information_schema
innodb_sys
mysql
>
USE information_schema;
Database changed
mysql
>SHOW
TABLES
LIKE'innodb_sys%'
;
+--------------------------------------------+ |
Tables_in_information_schema (innodb_sys
%
)
|
+--------------------------------------------+
|
INNODB_SYS_DATAFILES
|
|
INNODB_SYS_VIRTUAL
|
|
INNODB_SYS_INDEXES
|
|
INNODB_SYS_TABLES
|
|
INNODB_SYS_FIELDS
|
|
INNODB_SYS_TABLESPACES
|
|
INNODB_SYS_FOREIGN_COLS
|
|
INNODB_SYS_COLUMNS
|
|
INNODB_SYS_FOREIGN
|
|
INNODB_SYS_TABLESTATS
|
+--------------------------------------------+
-
performance_schema
監控 MySQL 服務的各類效能指標
。包括統計最近執行了哪些語句,在執行過程的每個階段都 花費了多長時間,記憶體的使用情況等資訊。-
sys
檢視
的形式把 information_schema
和 performance_schema
結合起來,幫助系統管理員和開發人員監控 MySQL 的技術性能。2.2 資料庫在檔案系統中的表示
[root@RainbowSea mysql-8.0]
# cd /var/lib/mysql
[root@RainbowSea mysql]
# ll
總用量 188876
-rw-r-----. 1 mysql mysql 56 2月 9 17:33 auto.cnf
-rw-r-----. 1 mysql mysql 1720 2月 9 20:35 binlog.000001
-rw-r-----. 1 mysql mysql 16 2月 9 17:37 binlog.index
-rw-------. 1 mysql mysql 1680 2月 9 17:33 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 2月 9 17:33 ca.pem
-rw-r--r--. 1 mysql mysql 1112 2月 9 17:33 client-cert.pem
-rw-------. 1 mysql mysql 1680 2月 9 17:33 client-key.pem
-rw-r-----. 1 mysql mysql 196608 2月 9 20:37
#ib_16384_0.dblwr
-rw-r-----. 1 mysql mysql 8585216 2月 9 17:33
#ib_16384_1.dblwr
-rw-r-----. 1 mysql mysql 5931 2月 9 17:33 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 2月 9 20:35 ibdata1
-rw-r-----. 1 mysql mysql 50331648 2月 9 20:37 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 2月 9 17:33 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 2月 9 17:37 ibtmp1
drwxr-x---. 2 mysql mysql 4096 2月 9 17:37
#innodb_temp
drwxr-x---. 2 mysql mysql 4096 2月 9 17:33 mysql
-rw-r-----. 1 mysql mysql 25165824 2月 9 20:35 mysql.ibd
srwxrwxrwx. 1 mysql mysql 0 2月 9 17:37 mysql.sock
-rw-------. 1 mysql mysql 6 2月 9 17:37 mysql.sock.lock
drwxr-x---. 2 mysql mysql 4096 2月 9 17:33 performance_schema
-rw-------. 1 mysql mysql 1680 2月 9 17:33 private_key.pem
-rw-r--r--. 1 mysql mysql 452 2月 9 17:33 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 2月 9 17:33 server-cert.pem
-rw-------. 1 mysql mysql 1676 2月 9 17:33 server-key.pem
drwxr-x---. 2 mysql mysql 4096 2月 9 17:33 sys
-rw-r-----. 1 mysql mysql 16777216 2月 9 20:31 undo_001
-rw-r-----. 1 mysql mysql 16777216 2月 9 20:37 undo_002
[root@RainbowSea mysql]
#
[root@RainbowSea mysql]
#

information_schema
資料目錄


3. 表在檔案系統中的表示
3.1 InnoDB儲存引擎模式
InnoDB
在 資料目錄
下對應的資料庫子目錄下建立了一個專門用於 描述表結構的檔案
,檔名是這樣:
表名.frm
ysql
>
USE rainbowsea;
Database changed
mysql
>CREATETABLE
test (
->
c1
INT
->
);
Query OK,
0rows
affected (
0.03
sec)
rainbowsea
對應的子目錄下就會建立一個名為 test.frm
的用於描述表結構的檔案。.frm檔案 的格式在不同的平臺上都是相同的。這個字尾名為.frm是以 二進位制格式
儲存的,我們直接開啟是亂碼 的。-
系統表空間(system tablespace)
ibdata1
、大小為12M
的檔案,這個檔案就是對應 的 系統表空間
在檔案系統上的表示。怎麼才12M?注意這個檔案是 自擴充套件檔案
,當不夠用的時候它會自 己增加檔案大小。ibdata1
這個檔名 難聽,那可以在MySQL啟動時配置對應的檔案路徑以及它們的大小,比如我們這樣修改一下my.cnf 配置 檔案:[server]
innodb_data_file_path
=
data1:512M;data2:512M:autoextend
-
獨立表空間 (file-per-table tablespace)
每 一個表建立一個獨立表空間
,也就是說我們建立了多少個表,就有多少個獨立表空間
。使用 獨立表空間 來 儲存表資料的話,會在該表所屬資料庫對應的子目錄下建立一個表示該獨立表空間的檔案,檔名和表 名相同,只不過添加了一個.ibd
的副檔名而已,所以完整的檔名稱長這樣:
表名.ibd
獨立表空間
去儲存 rainbowsea
資料庫下的 test
表的話,那麼在該表所在資料庫對應的 rainbowsea
目錄下會為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
inset
(0.01 sec)

-
其他型別的表空間
3.2 MyISAM儲存引擎模式
-
表結構
MyISAM
和 InnoDB
一樣,也是在 資料目錄
下對應的資料庫子目錄下建立了一個專 門用於描述表結構的檔案:
表名.frm
-
表中資料和索引
二級索引
,該儲存引擎的 資料和索引是分開存放
的。所以在檔案系統中也是 使用不同的檔案來儲存資料檔案和索引檔案,同時表資料都存放在對應的資料庫子目錄下。假如 test
表使用MyISAM儲存引擎的話,那麼在它所在資料庫對應的 rainbowsea
目錄下會為test
表建立這三個文 件:
test.frm 儲存表結構
test.MYD 儲存資料(MYData)
test.MYI 儲存索引(MYIndex)
CREATETABLE
`student_myisam` (
`id`
bigintNOTNULL
AUTO_INCREMENT,
`name`
varchar
(
64
)
DEFAULTNULL
,
`age`
intDEFAULTNULL
,
`sex`
varchar
(
2
)
DEFAULTNULL
,
PRIMARY
KEY (`id`)
)ENGINE
=
MYISAM AUTO_INCREMENT
=0DEFAULT
CHARSET
=
utf8mb3;
4. 小結
-
如果表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
檔案中。
-
如果表 b 採用
MyISAM
,data\a 中會產生 3 個檔案:
MySQL5.7 中:b.frm
:描述表結構檔案,欄位長度等。 MySQL8.0 中:b.xxx.sdi
:描述表結構檔案,欄位長度等。b.MYD
(MYData):資料資訊檔案,儲存資料資訊(如果採用獨立表儲存模式)b.MYI
(MYIndex):存放索引資訊檔案
5. 最後:
“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關注和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”