談談什麼是MySQL的表空間?
阿新 • • 發佈:2020-11-23
今天我要跟你分享的話題是:“大家常說的表空間到底是什麼?究竟什麼又是資料表?”
這其實是一個概念性的知識點,當作拓展知識。涉及到的概念大家瞭解一下就好,涉及的引數,留個印象就好。
### 一、什麼是表? 但凡是用過MySQL都知道,直觀上看,MySQL的資料都存在資料表中。 比如一條Update SQL: ```bash update user set username = '白日夢' where id = 999; ``` 它將user這張資料表中id為1的記錄的username列修改成了‘白日夢’ 這裡的user其實就是資料表。當然這不是重點,重點是我想表達:資料表其實是邏輯上的概念。而下面要說的表空間是物理層面的概念。
### 二、什麼是表空間? 不知道你有沒有看到過這句話:“在innodb儲存引擎中資料是按照表空間來組織儲存的”。其實有個潛臺詞是:表空間是表空間檔案是實際存在的**物理檔案**。 大家不用糾結為啥它叫表空間、為啥表空間會對應著磁碟上的物理檔案,因為MySQL就是這樣設計、設定的。直接接受這個概念就好了。 MySQL有很多種表空間,下面一起來了解一下。
### 三、sys表空間 你可以像下面這樣檢視你的MySQL的系統表空間 ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101437729-194019602.png) Value部分的的組成是:`name:size:attributes` 預設情況下,MySQL會初始化一個大小為12MB,名為ibdata1檔案,並且隨著資料的增多,它會自動擴容。 這個ibdata1檔案是系統表空間,也是預設的表空間,也是預設的表空間物理檔案,也是傳說中的共享表空間。 > 關於這個共享表空間,直觀上看,如果這個表空間能為multiple tables.儲存資料,那麼它就可以被稱為共享表空間,所以你可以認為系統表空間是共享表空間。
### 四、配置sys表空間 系統表空間的數量和大小可以通過啟動引數:`innodb_data_file_path` ``` # my.cnf [mysqld] innodb_data_file_path=/dir1/ibdata1:2000M;/dir2/ibdata2:2000M:autoextend ``` ibdata1表空間為固定大小2000M,而ibdata2的2000M使用完後會自動增長。 假設你的伺服器有兩塊儲存A、B。並且A、B上分別掛載著dir1目錄和dir2目錄。那你再看上面的配置,它其實是在使用兩個不同磁碟上的檔案共同構建表空間。由於這兩個檔案位於不同的磁碟上,磁碟的負載就會被均分,資料庫整體的效能也有所提升。
### 五、file per table 表空間 如果你想讓每一個數據庫表都有一個單獨的表空間檔案的話,可以通過引數`innodb_file_per_table`設定。 > 這個引數只有在MySQL5.6或者是更高的版本中才可以使用。 可以通過配置檔案 ```bash [mysqld] innodb_file_per_table=ON ``` 也可以通過命令 ```bash mysql> SET GLOBAL innodb_file_per_table=ON; ``` ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101439177-795862898.png) 讓你將其設定為ON,那之後InnoDB儲存引擎產生的表都會自己獨立的表空間檔案。 獨立的表空間檔案命名規則:表名.ibd > **注意:** > > 獨立表空間檔案中僅存放該表對應資料、索引、insert buffer bitmap。 > > 其餘的諸如:undo資訊、insert buffer 索引頁、double write buffer 等資訊依然放在預設表空間,也就是共享表空間中。 > > 這裡的undo、insert buffer、double write buffer 如果你不瞭解他們是啥也沒關係。按照大綱排期,我會在第 41、42 篇文中跟大家分享。在這裡只需要先了解即使你設定了`innodb_file_per_table=ON` 共享表空間的體量依然會不斷的增長,並且你即使你不斷的使用undo進行rollback,共享表空間大小也不會縮減就好了。 檢視我的表空間檔案: ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101439722-1448958395.png) 最後再簡述一下這種file per table的優缺點: **優點:** * 提升容錯率,表A的表空間損壞後,其他表空間不會收到影響。s * 使用MySQL Enterprise Backup快速備份或還原在每表文件表空間中建立的表,不會中斷其他`InnoDB` 表的使用 **缺點:** * 對fsync系統呼叫來說不友好,如果使用一個表空間檔案的話單次系統呼叫可以完成資料的落盤,但是如果你將表空間檔案拆分成多個。原來的一次fsync可能會就變成針對涉及到的所有表空間檔案分別執行一次fsync,增加fsync的次數。 > fsync我計劃會在第 18 篇文章中跟大家分享。歡迎關注!持續更新中~
### 六、臨時表空間 臨時表空間用於存放使用者建立的臨時表和磁碟內部臨時表。 引數`innodb_temp_data_file_path`定義了臨時表空間的一些名稱、大小、規格屬性如下圖: ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101440357-1399583946.png) 檢視臨時表空間檔案存放的目錄 ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101440871-1147165807.png)
### **七、undo表空間** 相信你肯定聽過說undolog,常見的當你的程式想要將事物rollback時,底層MySQL其實就是通過這些undo資訊幫你回滾的。 在MySQL的設定中,有一個表空間可以專門用來存放undolog的日誌檔案。 然而,在MySQL的設定中,預設的會將undolog放置到系統表空間中。 如果你的MySQL是新安裝的,那你可以通過下面的命令看看你的MySQL undo表空間的使用情況: ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101441966-1591848320.png) 大家可以看到,我的MySQL的undo log 表空間有兩個。 也就是我的undo從預設的系統表空間中轉移到了undo log專屬表空間中了。 ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101442764-1020855951.png) 那undo log到底是該使用預設的配置放在系統表空間呢?還是該放在undo表空間呢? 這其實取決伺服器使用的儲存卷的型別。 如果是SSD儲存,那推薦將undo info存放在 undo表空間中。 > 白日夢計劃在**第19篇文章**中跟大家分享 undolog 相關的知識點。**歡迎關注** 參考: https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace.html https://dev.mysql.com/doc/refman/5.7/en/innodb-system-tablespace.html https://dev.mysql.com/doc/refman/5.7/en/innodb-file-per-table-tablespaces.html https://dev.mysql.com/doc/refman/5.7/en/general-tablespaces.html https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html https://dev.mysql.com/doc/refman/5.7/en/innodb-init-startup-configuration.html
### 關注送書!《Netty實戰》
### 一、什麼是表? 但凡是用過MySQL都知道,直觀上看,MySQL的資料都存在資料表中。 比如一條Update SQL: ```bash update user set username = '白日夢' where id = 999; ``` 它將user這張資料表中id為1的記錄的username列修改成了‘白日夢’ 這裡的user其實就是資料表。當然這不是重點,重點是我想表達:資料表其實是邏輯上的概念。而下面要說的表空間是物理層面的概念。
### 二、什麼是表空間? 不知道你有沒有看到過這句話:“在innodb儲存引擎中資料是按照表空間來組織儲存的”。其實有個潛臺詞是:表空間是表空間檔案是實際存在的**物理檔案**。 大家不用糾結為啥它叫表空間、為啥表空間會對應著磁碟上的物理檔案,因為MySQL就是這樣設計、設定的。直接接受這個概念就好了。 MySQL有很多種表空間,下面一起來了解一下。
### 三、sys表空間 你可以像下面這樣檢視你的MySQL的系統表空間 ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101437729-194019602.png) Value部分的的組成是:`name:size:attributes` 預設情況下,MySQL會初始化一個大小為12MB,名為ibdata1檔案,並且隨著資料的增多,它會自動擴容。 這個ibdata1檔案是系統表空間,也是預設的表空間,也是預設的表空間物理檔案,也是傳說中的共享表空間。 > 關於這個共享表空間,直觀上看,如果這個表空間能為multiple tables.儲存資料,那麼它就可以被稱為共享表空間,所以你可以認為系統表空間是共享表空間。
### 四、配置sys表空間 系統表空間的數量和大小可以通過啟動引數:`innodb_data_file_path` ``` # my.cnf [mysqld] innodb_data_file_path=/dir1/ibdata1:2000M;/dir2/ibdata2:2000M:autoextend ``` ibdata1表空間為固定大小2000M,而ibdata2的2000M使用完後會自動增長。 假設你的伺服器有兩塊儲存A、B。並且A、B上分別掛載著dir1目錄和dir2目錄。那你再看上面的配置,它其實是在使用兩個不同磁碟上的檔案共同構建表空間。由於這兩個檔案位於不同的磁碟上,磁碟的負載就會被均分,資料庫整體的效能也有所提升。
### 五、file per table 表空間 如果你想讓每一個數據庫表都有一個單獨的表空間檔案的話,可以通過引數`innodb_file_per_table`設定。 > 這個引數只有在MySQL5.6或者是更高的版本中才可以使用。 可以通過配置檔案 ```bash [mysqld] innodb_file_per_table=ON ``` 也可以通過命令 ```bash mysql> SET GLOBAL innodb_file_per_table=ON; ``` ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101439177-795862898.png) 讓你將其設定為ON,那之後InnoDB儲存引擎產生的表都會自己獨立的表空間檔案。 獨立的表空間檔案命名規則:表名.ibd > **注意:** > > 獨立表空間檔案中僅存放該表對應資料、索引、insert buffer bitmap。 > > 其餘的諸如:undo資訊、insert buffer 索引頁、double write buffer 等資訊依然放在預設表空間,也就是共享表空間中。 > > 這裡的undo、insert buffer、double write buffer 如果你不瞭解他們是啥也沒關係。按照大綱排期,我會在第 41、42 篇文中跟大家分享。在這裡只需要先了解即使你設定了`innodb_file_per_table=ON` 共享表空間的體量依然會不斷的增長,並且你即使你不斷的使用undo進行rollback,共享表空間大小也不會縮減就好了。 檢視我的表空間檔案: ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101439722-1448958395.png) 最後再簡述一下這種file per table的優缺點: **優點:** * 提升容錯率,表A的表空間損壞後,其他表空間不會收到影響。s * 使用MySQL Enterprise Backup快速備份或還原在每表文件表空間中建立的表,不會中斷其他`InnoDB` 表的使用 **缺點:** * 對fsync系統呼叫來說不友好,如果使用一個表空間檔案的話單次系統呼叫可以完成資料的落盤,但是如果你將表空間檔案拆分成多個。原來的一次fsync可能會就變成針對涉及到的所有表空間檔案分別執行一次fsync,增加fsync的次數。 > fsync我計劃會在第 18 篇文章中跟大家分享。歡迎關注!持續更新中~
### 六、臨時表空間 臨時表空間用於存放使用者建立的臨時表和磁碟內部臨時表。 引數`innodb_temp_data_file_path`定義了臨時表空間的一些名稱、大小、規格屬性如下圖: ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101440357-1399583946.png) 檢視臨時表空間檔案存放的目錄 ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101440871-1147165807.png)
### **七、undo表空間** 相信你肯定聽過說undolog,常見的當你的程式想要將事物rollback時,底層MySQL其實就是通過這些undo資訊幫你回滾的。 在MySQL的設定中,有一個表空間可以專門用來存放undolog的日誌檔案。 然而,在MySQL的設定中,預設的會將undolog放置到系統表空間中。 如果你的MySQL是新安裝的,那你可以通過下面的命令看看你的MySQL undo表空間的使用情況: ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101441966-1591848320.png) 大家可以看到,我的MySQL的undo log 表空間有兩個。 也就是我的undo從預設的系統表空間中轉移到了undo log專屬表空間中了。 ![](https://img2020.cnblogs.com/blog/1496926/202011/1496926-20201123101442764-1020855951.png) 那undo log到底是該使用預設的配置放在系統表空間呢?還是該放在undo表空間呢? 這其實取決伺服器使用的儲存卷的型別。 如果是SSD儲存,那推薦將undo info存放在 undo表空間中。 > 白日夢計劃在**第19篇文章**中跟大家分享 undolog 相關的知識點。**歡迎關注** 參考: https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace.html https://dev.mysql.com/doc/refman/5.7/en/innodb-system-tablespace.html https://dev.mysql.com/doc/refman/5.7/en/innodb-file-per-table-tablespaces.html https://dev.mysql.com/doc/refman/5.7/en/general-tablespaces.html https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html https://dev.mysql.com/doc/refman/5.7/en/innodb-init-startup-configuration.html
### 關注送書!《Netty實戰》
文章公號 首發!連載中!關注微信公號回覆:“抽獎” 還可參加抽