2011-08-25 43 views
3

我試圖將一個1000萬行的MySQL MyISAM錶轉換爲InnoDB。
我試過ALTER TABLE,但這讓我的服務器卡住了,所以我手動殺死了mysql。推薦的方式是什麼?將一個大的MyISAM轉換爲InnoDB

我想過的選項:
1.製作一個新的InnoDB表,每次插入一部分數據。
2.將表格轉儲到文本文件中,然後執行LOAD FILE
3.再次嘗試並保持服務器無響應,直到他完成(我嘗試了2小時,服務器是生產服務器,因此我寧願保留它運行)
4.複製表格,刪除其索引,然後轉換,然後添加索引

+0

#1看起來不錯,但您需要鎖定寫入表。 – Dor

回答

0

您是否試圖通過PK訂購您的數據?例如:

ALTER TABLE tablename ORDER BY PK_column; 

應該加快轉換速度。

+0

你能解釋爲什麼這應該有所幫助嗎? ORDER BY在我的表 – Noam

+1

INNODB中感覺像是一個很難的查詢我相信PK是一個聚集索引(數據和索引存儲在B樹中),所以通過預先排序它可以更容易地創建結構。 –

2

更改表的引擎需要重寫表,這就是爲什麼表不能長期使用。刪除索引,然後轉換和添加索引可能會加速初始轉換,但添加索引會在您的表上創建讀鎖,因此最後的效果將會相同。製作新表格並傳輸數據是一條可行的路線。通常這是通過2部分完成的 - 首先複製記錄,然後重播複製記錄時完成的任何更改。如果您可以在表中禁用插入/更新,而保留讀取,則這不是問題。如果沒有,有幾種可能的解決方案。其中之一是使用Facebook的online schema change工具。另一種選擇是將應用程序設置爲在遷移記錄的同時在兩個表中寫入,而不是僅切換到新記錄。這取決於應用程序代碼,關鍵部分是處理唯一鍵/重複項,如在舊錶中您可能更新記錄,而在新的您需要插入它。 (這裏事務隔離級別也可能起到關鍵作用,儘可能降低它)。 「經典」方式是使用複製,據我所知也是在兩部分中完成 - 您開始複製,記錄主位置,然後在第二個服務器中導入數據庫的轉儲,然後將其作爲從服務器啓動趕上變化。