1. 程式人生 > >MySQL架構三:如何轉換表的引擎

MySQL架構三:如何轉換表的引擎

有很多種方法可以將表的儲存引擎轉換成另外一種引擎。每種方法都有其優缺點,下面介紹三種方法。

① ALTER TABLE

將表從一個引擎修改為另一個引擎最簡單的方法就是使用ALTER TABLE語句,例:

ALTER TABLE table_name ENGINE = InnoDB;

上述語法可以適用於任何儲存引擎。但是有一個問題:當資料過多時,會需要執行很長時間,期間可能會消耗系統所有的I/O能力,同時會在原表上加讀鎖。MySQL會按行將資料從原表複製到一張新的表中,在資料量大的表上執行此操作需要注意這一點。

另外需要注意的是轉換表的引擎之後,將會失去原有引擎相關的所有特性。

② 匯入與匯出

為了更好的控制轉換的過程,可以使用mysqldump工具將資料匯出到檔案,然後修改檔案中CREATE TABLE語句的儲存引擎選項,注意同時修改表名,因為在一個數據庫中即使它們的儲存引擎不同,表名也不能重複。同時要注意mysqldump預設會自動在CREATE TABLE語句前加上DROP TABLE語句,一定要把這行sql刪除,否則後果你懂得。

③ 創建於查詢

第三種轉換的技術綜合了第一種方法的高效和第二種方法的安全。不需要匯出整個表的資料,而是先建立一個新的表,然後利用insert ... select ... 語法來導資料:

start transaction;

insert into innodb_table select id,name from myisam_table where id between x and y;

commit;

這樣操作完成以後,新的表時原表的一個全量賦值,原表還在,如果需要可以刪除原表。如果有必要可以在執行過程中對原表加鎖以保證資料的一致性。

Percona Toolkit提供了一個pt-online-schema-change的工具(基於Facebook的線上schema變更),可以比較簡單的執行這個過程,以避免手工操作導致的失誤。