1. 程式人生 > >innodb_file_per_table - 轉換為InnoDB

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的配置變數。

要使用此變數,可以將以下內容放入/etc/my.cnf,以將InnoDB轉換為每個InnoDB引擎表的每個表文件:

碼:
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.驅動器空間填滿轉換的可能問題