Using Per-Table Tablespaces - 美好夏日的部落格 - udn部落格
美好夏日的部落格
作家:美好夏日
文章分類
    Top
    Using Per-Table Tablespaces
    2015/11/26 15:09:07
    瀏覽:450
    迴響:0
    推薦:0
    引用0
    默認情況下,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可以回收磁盤空間,因為會建立新文件,刪除舊文件,數據就緊湊了。
    回應

    限會員,要發表迴響,請先登入