默認情況下,innodb表使用共享表空間存儲數據和索引。mysql同時提供了另一種選擇,將每個表的數據和索引放在單獨的文件中,這就是“獨占表空間”或者說“多表空間”,設置了之後,每個表有單獨的表空間。
一、獨占表空間的優點:
①、可以在不影響其他innodb表的情況下對單個表進行備份和恢復。
②、可以將特定的表放在特定的磁盤上,利於優化IO和備份。
③、使用compressed_row_format行記錄模式壓縮數據。
④、truncate table會回收表空間,這是對比共享表空間很大的優勢。
⑤、監控表的大小,不用進入mysql查看table status,只需要在數據目錄中查看文件大小就可以了。
二、開啟/關閉獨占表空間
在my.cnf中設置
[mysqld]
innodb_file_per_table
獨立表空間打開之後,innodb會為新建的表生成單獨的tbl_name.ibd文件,文件在各自的database目錄下。區別於MyISAM表的特點——MYSIAM表會產生單獨的tbl_name.MYD 和 tbl_name.MYI 文件分別存放數據和索引——INNODB將數據和索引存在一個.ibd文件中,同時照常產生 tbl_name.frm(表結構)文件。
如果關閉innodb_file_per_table,INNODB又會將新表的數據和索引放在共享的文件中。
可以將數據從共享表空間轉移到獨占表空間或者反過來,而不用管my.cnf中的配置,用下面的方法實現:
-- Move table from system tablespace to its own tablespace.
SET GLOBAL innodb_file_per_table=1;
ALTER TABLE table_name ENGINE=InnoDB;
-- Move table from its own tablespace to system tablespace.
SET GLOBAL innodb_file_per_table=0;
ALTER TABLE table_name ENGINE=InnoDB;
轉移表:
你可以像移動MYSIAM文件一樣將.ibd文件在數據庫目錄之間隨意移動,因為表定義記錄在共享表空間中,包括數據庫的名字。不同的數據庫之間,保存在各自表空間中的事物ID和日誌序列號也都是不一樣的。使用RENAME更改表定義:
RENAME TABLE db1.tbl_name TO db2.tbl_name;
PS:共享表空間始終是要使用的,因為裏面保存了表的元數據和undo日誌。只有.ibd文件innodb是無法工作的。將大表從共享表空間移出後,共享 表空間不會回收磁盤,但是可以被新表使用。這種情況下如果磁盤不足,那麽最好打開獨立表空間,使用mysqldump重建實例。
表空間回收:
獨占表空間在刪除數據的時候也是不會回收磁盤空間的。使用optimize table 或者alter table table_name engine=innodb可以回收磁盤空間,因為會建立新文件,刪除舊文件,數據就緊湊了。