Mysql-5

加快 MyISAM 到 InnoDB 的轉換

  • August 16, 2011

我有一個 mysql 5.1 伺服器,它的數據庫大約有 450 個表,佔用 4GB 。這些表中的絕大多數(除了 2 個)都是 MyIsam。這在大多數情況下都很好(不需要事務),但是應用程序一直在獲得流量,並且某些表由於更新時的表鎖定而受到影響。這就是現在有 2 個表是 InnoDB 的原因。

較小表(100k 行)上的轉換根本不需要很長時間,導致停機時間最短。然而,我的一些跟踪表接近 5000 萬行。有沒有辦法加快ALTER TABLE...ENGINE InnoDB大桌子的速度?如果沒有,是否還有其他方法可以將這些寫入繁重的表的停機時間最小化?

首先讓我說,我討厭 ALTER。這是邪惡的,恕我直言。

說,這是您目前的表架構 -

CREATE TABLE my_table_of_love (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=MyISAM CHARSET=utf8;

這是我推薦的路徑 -

創建一個將替換舊表對象的新表對象:

CREATE TABLE my_table_of_love_NEW (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8

按名稱將舊表中的所有行插入到新表中:

INSERT INTO my_table_of_love_NEW (id,my_value,date_created)
SELECT id,my_value,date_created FROM my_table_of_love;

冒煙測試您的遷移:

SELECT COUNT(*) FROM my_table_of_love_NEW;
SELECT COUNT(*) FROM my_table_of_love;
SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a
LEFT JOIN my_table_of_love b ON (b.id = a.id)
WHERE a.my_value != b.my_value;

交換錶名,以便在需要回滾時維護備份。

RENAME TABLE my_table_of_love TO my_table_of_love_OLD;
RENAME TABLE my_table_of_love_NEW TO my_table_of_love;

繼續進行回歸測試。

對於具有多個索引和數百萬行的表,這種方法變得越來越可取。

想法?

引用自:https://dba.stackexchange.com/questions/310