MySQL的資料目錄(詳解講解)

1. MySQL8 的主要目錄結構

安裝好MySQL 8之後,我們檢視如下的目錄結構:

[root@atguigu01 ~]

# find / -name mysql

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 相關命令目錄

相關命令目錄:/usr/bin(mysqladmin、mysqlbinlog、mysqldump等命令)和/usr/sbin。

1.2 配置檔案目錄

配置檔案目錄:/usr/share/mysql-8.0(命令及配置檔案),/etc/mysql(如my.cnf)

[root@RainbowSea ~]

# cd /usr/share/mysql-8.0/

2. 資料庫和檔案系統的關係

2.1 檢視預設資料庫

檢視一下在我的計算機上當前有哪些資料庫:

mysql

>SHOW

DATABASES;

可以看到有4個數據庫是屬於MySQL自帶的系統資料庫。
  • mysql
MySQL 系統自帶的核心資料庫,它儲存了MySQL的使用者賬戶和許可權資訊,一些儲存過程、事件的定 義資訊,一些執行過程中產生的日誌資訊,一些幫助資訊以及時區資訊等。
  • information_schema
MySQL 系統自帶的資料庫,這個資料庫儲存著MySQL伺服器 

維護的所有其他資料庫的資訊

,比如有 哪些表、哪些檢視、哪些觸發器、哪些列、哪些索引。這些資訊並不是真實的使用者資料,而是一些 描述性資訊,有時候也稱之為 

元資料

 。在系統資料庫 

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 系統自帶的資料庫,這個資料庫裡主要儲存MySQL伺服器執行過程中的一些狀態資訊,可以 用來監控 MySQL 服務的各類效能指標。包括統計最近執行了哪些語句,在執行過程的每個階段都 花費了多長時間,記憶體的使用情況等資訊。
  • sys
MySQL 系統自帶的資料庫,這個資料庫主要是透過 檢視 的形式把 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

這個系統資料庫外,其他的資料庫 在 

資料目錄

 下都有對應的子目錄。

以我的 temp 資料庫為例,在MySQL5.7 中開啟:
在MySQL8.0中開啟:

3. 表在檔案系統中的表示

3.1 InnoDB儲存引擎模式

1. 表結構:
為了儲存表結構, InnoDB 在 資料目錄 下對應的資料庫子目錄下建立了一個專門用於 描述表結構的檔案 ,檔名是這樣:

表名.frm

比方說我們在 rainbowsea 資料庫下建立一個名為 test 的表:

ysql

>

USE rainbowsea;

Database changed

mysql

>CREATETABLE

test (

->

c1

INT

->

);

Query OK,

0rows

affected (

0.03

sec)

那在資料庫 rainbowsea 對應的子目錄下就會建立一個名為 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.6以及之後的版本中,InnoDB並不會預設的把各個表的資料儲存到系統表空間中,而是為 每 一個表建立一個獨立表空間,也就是說我們建立了多少個表,就有多少個獨立表空間。使用 獨立表空間 來 儲存表資料的話,會在該表所屬資料庫對應的子目錄下建立一個表示該獨立表空間的檔案,檔名和表 名相同,只不過添加了一個.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)

  • 其他型別的表空間
隨著MySQL的發展,除了上述兩種老牌表空間之外,現在還新提出了一些不同型別的表空間,比如通用 表空間(general tablespace)、臨時表空間(temporary tablespace)等。

3.2 MyISAM儲存引擎模式

  1. 表結構
在儲存表結構方面,MyISAM 和 InnoDB 一樣,也是在 資料目錄 下對應的資料庫子目錄下建立了一個專 門用於描述表結構的檔案:

表名.frm

  1. 表中資料和索引
在MyISAM中的索引全部都是二級索引 ,該儲存引擎的 資料和索引是分開存放 的。所以在檔案系統中也是 使用不同的檔案來儲存資料檔案和索引檔案,同時表資料都存放在對應的資料庫子目錄下。假如 test表使用MyISAM儲存引擎的話,那麼在它所在資料庫對應的 rainbowsea目錄下會為test 表建立這三個文 件:

test.frm 儲存表結構

test.MYD 儲存資料(MYData)

test.MYI 儲存索引(MYIndex)

舉例:建立一個 MyISAM 表,使用 ENGINE 選項顯式指定引擎。因為 InnoDB 是預設引擎。
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. 小結

舉例: 資料庫a,表 b
  1. 如果表b 採用 InnoDB ,data\a 中會產生1個或者 2個檔案:
  • b.frm:描述表結構檔案,欄位長度等
  • 如果採用 系統表空間 模式的,資料資訊和索引資訊都儲存在 ibdata1 中
  • 如果採用 獨立表空間 儲存模式,data\a 中還會產生 b.ibd 檔案(儲存資料資訊和索引資訊)
此外:
  1. MySQL5.7 中會在 data/a 的目錄下生成 db.opt 檔案用於儲存資料庫的相關配置,比如:字元集,比較規則。而 MySQL8.0 不再提供 db.opt 檔案。
  2. MySQL8.0 中不再單獨提供 b.frm ,而是合併在 b.ibd 檔案中。
  1. 如果表 b 採用 MyISAM,data\a 中會產生 3 個檔案:
  • MySQL5.7 中:b.frm :描述表結構檔案,欄位長度等。
  • MySQL8.0 中:b.xxx.sdi :描述表結構檔案,欄位長度等。
  • b.MYD (MYData):資料資訊檔案,儲存資料資訊(如果採用獨立表儲存模式)
  • b.MYI (MYIndex):存放索引資訊檔案

5. 最後:

“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關注和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”
連結:https://www.cnblogs.com/TheMagicalRainbowSea/p/18729003
(版權歸原作者所有,侵刪)


相關文章