啟用獨立表空間innodb_file_per_table(如果這個參數沒有開啟,mysql會將數據、索引、元數據都存入到ibdata中的) 數據表 表索引 MVCC(多版本並發控制)數據 回滾段 撤銷表空間 表元數據,都寫入到了ibdata1文件中。
show variables like '%per_table'; 查看innode_file_per_table 參數的狀態
想要將共享表空間轉化為獨立表空間有兩種方法:
1.先邏輯備份,然后修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務后將邏輯備份導入即可。
2.修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務后將需要修改的所有innodb表都執行一遍:alter table table_name engine=innodb;
使用第二種方式修改后,原來庫中的表中的數據會繼續存放於ibdata1中,新建的表才會使用獨立表空間
1 簡介
Innodb存儲引擎可將所有數據存放於ibdata*的共享表空間,也可將每張表存放於獨立的.ibd文件的獨立表空間。
共享表空間以及獨立表空間都是針對數據的存儲方式而言的。
共享表空間: 某一個數據庫的所有的表數據,索引文件全部放在一個文件中,默認這個共享表空間的文件路徑在data目錄下。 默認的文件名為:ibdata1 初始化為10M。
獨立表空間: 每一個表都將會生成以獨立的文件方式來進行存儲,每一個表都有一個.frm表描述文件,還有一個.ibd文件。 其中這個文件包括了單獨一個表的數據內容以及索引內容,默認情況下它的存儲位置也是在表的位置之中。
2 二者優缺點
2.1 共享表空間:
優點:
可以將表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同的文件上)。數據和文件放在一起方便管理。
缺點:
所有的數據和索引存放到一個文件中,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對於一個表做了大量刪除操作后表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共享表空間。
2.2 獨立表空間:
在配置文件(my.cnf)中設置: innodb_file_per_table
優點:
1.每個表都有自已獨立的表空間。
2.每個表的數據和索引都會存在自已的表空間中。
3.可以實現單表在不同的數據庫中移動。
4.空間可以回收(除drop table操作處,表空不能自已回收)
a.Drop table操作自動回收表空間,如果對於統計分析或是日值表,刪除大量數據后可以通過:alter table TableName engine=innodb;回縮不用的空間。
b.對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。
c.對於使用獨立表空間的表,不管怎么刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。
缺點:
單表增加過大,如超過100個G。
相比較之下,使用獨占表空間的效率以及性能會更高一點。
3 獨立表空間參數innodb_file_per_table詳解
3.1參數列表:
3.2 參數功能
該參數在mysql5.6.6及其后續版本默認開啟,開啟該參數的時候,Innodb將每個新創建的表的數據及索引存儲在一個獨立的.ibd文件里,而不是系統的表空間。當這些innodb表被刪除或清空的時候,存儲空間會被回收。
開啟innodb_file_per_table,在ALTER TABLE操作重建表的情況下,會將innodb表從系統共享表空間移動到獨立的.ibd文件。
不開啟innodb_file_per_table,innodb會將所有表及索引的數據存儲在構成系統表空間的ibdata文件。這樣會降低文件系統操作的性能開銷,例如DROP TABLE 或 TRUNCATE TABLE。它最適合於將整合磁盤都用於存儲mysql數據的情況,因為系統表空間不會收縮,所有的數據庫都在一個空間實例里面。當innodb_file_per_table=OFF的時候,應避免在空間受限的系統表空間里導入大量臨時數據。
innodb_file_per_table 可通過SET GLOBAL動態的修改為ON或OFF,也可以在my.cnf中做永久性修改,在my.cnf中修改后生效的話需要重啟mysqld服務。
注:動態修改后僅對后續操作生效,如原來為共享表空間,動態修改為獨立表空間后僅新建的表為獨立表空間。
4 innodb共享表空間轉化為獨立表空間
查看當前表空間情況:
表示當前是共享表空間。
想要將共享表空間轉化為獨立表空間有兩種方法:
1.先邏輯備份,然后修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務后將邏輯備份導入即可。
2.修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務后將需要修改的所有innodb表都執行一遍:alter table table_name engine=innodb;
Innodb存儲引擎可將所有數據存放於ibdata*的共享表空間,也可將每張表存放於獨立的.ibd文件的獨立表空間。
共享表空間以及獨立表空間都是針對數據的存儲方式而言的。
共享表空間: 某一個數據庫的所有的表數據,索引文件全部放在一個文件中,默認這個共享表空間的文件路徑在data目錄下。 默認的文件名為:ibdata1 初始化為10M。
獨立表空間: 每一個表都將會生成以獨立的文件方式來進行存儲,每一個表都有一個.frm表描述文件,還有一個.ibd文件。 其中這個文件包括了單獨一個表的數據內容以及索引內容,默認情況下它的存儲位置也是在表的位置之中。
2 二者優缺點
2.1 共享表空間:
優點:
可以將表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同的文件上)。數據和文件放在一起方便管理。
缺點:
所有的數據和索引存放到一個文件中,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對於一個表做了大量刪除操作后表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共享表空間。
2.2 獨立表空間:
在配置文件(my.cnf)中設置: innodb_file_per_table
優點:
1.每個表都有自已獨立的表空間。
2.每個表的數據和索引都會存在自已的表空間中。
3.可以實現單表在不同的數據庫中移動。
4.空間可以回收(除drop table操作處,表空不能自已回收)
a.Drop table操作自動回收表空間,如果對於統計分析或是日值表,刪除大量數據后可以通過:alter table TableName engine=innodb;回縮不用的空間。
b.對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。
c.對於使用獨立表空間的表,不管怎么刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。
缺點:
單表增加過大,如超過100個G。
相比較之下,使用獨占表空間的效率以及性能會更高一點。
3 獨立表空間參數innodb_file_per_table詳解
3.1參數列表:
Command-Line Format | --innodb_file_per_table |
||
System Variable | Name | innodb_file_per_table |
|
Variable Scope | Global | ||
Dynamic Variable | Yes | ||
Permitted Values (<= 5.6.5) | Type | boolean |
|
Default | OFF |
||
Permitted Values (>= 5.6.6) | Type | boolean |
|
Default | ON |
該參數在mysql5.6.6及其后續版本默認開啟,開啟該參數的時候,Innodb將每個新創建的表的數據及索引存儲在一個獨立的.ibd文件里,而不是系統的表空間。當這些innodb表被刪除或清空的時候,存儲空間會被回收。
開啟innodb_file_per_table,在ALTER TABLE操作重建表的情況下,會將innodb表從系統共享表空間移動到獨立的.ibd文件。
不開啟innodb_file_per_table,innodb會將所有表及索引的數據存儲在構成系統表空間的ibdata文件。這樣會降低文件系統操作的性能開銷,例如DROP TABLE 或 TRUNCATE TABLE。它最適合於將整合磁盤都用於存儲mysql數據的情況,因為系統表空間不會收縮,所有的數據庫都在一個空間實例里面。當innodb_file_per_table=OFF的時候,應避免在空間受限的系統表空間里導入大量臨時數據。
innodb_file_per_table 可通過SET GLOBAL動態的修改為ON或OFF,也可以在my.cnf中做永久性修改,在my.cnf中修改后生效的話需要重啟mysqld服務。
- mysql> set global innodb_file_per_table =ON;
- mysql> show variables like '%per_table%';
- +-----------------------+-------+
- | Variable_name | Value |
- +-----------------------+-------+
- | innodb_file_per_table | ON |
- +-----------------------+-------+
4 innodb共享表空間轉化為獨立表空間
查看當前表空間情況:
- mysql> show variables like '%per_table';
- +-----------------------+-------+
- | Variable_name | Value |
- +-----------------------+-------+
- | innodb_file_per_table | OFF |
- +-----------------------+-------+
想要將共享表空間轉化為獨立表空間有兩種方法:
1.先邏輯備份,然后修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務后將邏輯備份導入即可。
2.修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務后將需要修改的所有innodb表都執行一遍:alter table table_name engine=innodb;
使用第二種方式修改后,原來庫中的表中的數據會繼續存放於ibdata1中,新建的表才會使用獨立表空間