innodb_file_per_table - 轉換為InnoDB
共享InnoDB / var / lib / mysql / ibdata1儲存的問題
InnoDB表當前將資料和索引儲存到共享表空間(/ var / lib / mysql / ibdata1)。由於共享表空間,一個InnoDB表的資料損壞可能導致MySQL無法在整個計算機上啟動。修復InnoDB損壞可能非常難以執行,並且可能導致在修復過程中最初未損壞的表的資料丟失。
由於MySQL 5.5將使用InnoDB作為預設儲存引擎,因此考慮繼續利用/ var / lib / mysql / ibdata1中的共享表空間的後果非常重要。
使用innodb_file_per_table更改為每表表空間
作為解決問題的選項,MySQL有一個名為innodb_file per_table的配置變數。
innodb_file_per_table = 1
新增該行後,需要在機器上重新啟動MySQL。
在/etc/my.cnf中使用該行的結果將導致在新增行之後的任何資料庫在/ var / lib / mysql / database / location中建立.idb檔案。請注意,共享表空間仍將保留內部資料字典和撤消日誌。
轉換舊的InnoDB表
任何設定為先前在ibdata1中共享表空間的InnoDB表的舊資料庫仍將使用該檔案,因此需要將這些舊資料庫切換到新系統。MySQL CLI中的以下命令將建立InnoDB引擎表的列表以及為每個引擎執行的命令,以將它們轉換為新的innodb_file_per_table系統:
select concat('alter table ',TABLE_SCHEMA ,'.',table_name,' ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.tables where table_type='BASE TABLE' and engine = 'InnoDB';
我的測試計算機上的Roundcube示例在執行previous命令時顯示以下返回值:
alter table roundcube.cache ENGINE = InnoDB; alter table roundcube.contacts ENGINE = InnoDB;alter table roundcube.identities ENGINE = InnoDB; alter table roundcube.messages ENGINE = InnoDB; alter table roundcube.session ENGINE = InnoDB; alter table roundcube.users ENGINE = InnoDB;
然後,您只需發出MySQL CLI指出的命令,然後將每個錶轉換為新的innodb_file_per_table格式。
請注意,這些命令只需要在MySQL命令列中進行轉換,可以通過在bash提示符下輸入mysql在root SSH中訪問。
轉換舊InnoDB表的可能問題
1.轉換期間可能發生系統負載
2.驅動器空間填滿轉換的可能問題