2010-03-05 60 views
2

我做了我的數據庫的轉儲,其中一個表是非常巨大的(約400萬條記錄),並有很多索引(一個全文索引以及一個主鍵和3個獨特指數)。當我嘗試還原此轉儲時,它會嘗試執行啓用鍵(ALTER table x ENABLE keys)的語句時掛起(它已運行五天)。無法恢復從MySQL數據庫轉儲

任何有關如何恢復此轉儲的建議都非常值得歡迎。 表中的表格是myisam表格。

這裏是showprocesslist的輸出

mysql> show processlist; 
+------+----------+-------------------------------------------------+---------------+---------+------+----------------------+------------------------------------------------+ 
| Id | User  | Host           | db   | Command | Time | State    | Info           | 
+------+----------+-------------------------------------------------+---------------+---------+------+----------------------+------------------------------------------------+ 
| 2350 | rdsadmin | localhost:52508         | NULL   | Sleep | 3701 |      | NULL           | 
| 3331 | root  | <remote_ip>       | <db> | Query | 7971 | Repair with keycache | /*!40000 ALTER TABLE `entities` ENABLE KEYS */ | 
| 3810 | root  | <remote_ip> | NULL   | Query | 0 | NULL     | show processlist        | 
+------+----------+-------------------------------------------------+---------------+---------+------+----------------------+------------------------------------------------+ 
3 rows in set (0.00 sec) 

感謝

+0

ALTER語句位於數據之後或CREATE語句之後的位置在哪裏? – 2010-03-05 13:27:43

+2

您的任何文件系統已滿?例如/ tmp – nos 2010-03-05 13:30:10

+0

修改表位於數據之後,並且存在大量空的磁盤空間! 謝謝。 – Ishu 2010-03-05 14:12:30

回答

1

它如此緩慢的原因在於,alter table正在使用「使用keycache修復」來構建索引。這通過在索引中一次添加一個條目來構建索引。

更快的方法是使用「與排序一起修理」。但是,MySQL需要大量內存和臨時磁盤空間才能實現這一目標,而通常會發生的情況是,MySQL將通過使用「sort」方法啓動,耗盡空間並回退到「keycache」方法。

解決方法是讓MySQL服務器使用更多空間進行排序。這是由一些服務器變量控制:

這些都是動態變量,但我懷疑改變它們一旦改變表已經開始將有很多好處。如果你不想改變你的系統配置,那麼另一種方法是在修復模式下使用myisamchk構建索引,分配大量的排序緩衝區。

+0

oops - 我沒有注意到Ike的評論。我的答案實際上是這個的重複。 – Martin 2010-03-06 11:43:42

0

PostgreSQL不支持 「改變表X啓用鍵」 的語句:

alter table a enable keys; 
ERROR: syntax error at or near "keys" 
LINE 1: alter table a enable keys; 
          ^

嘗試mysqldump --compatible=postgresql傾倒你的MySQL數據庫 - 也許它會加載得很好。

您還可以嘗試先轉儲並只導入架構mysqldump --compatible=postresql --no-data。手動更正轉儲文件中的任何不兼容性會更容易。如果成功導入,則只能使用mysqldump --compatible=postresql --no-create-info轉儲和導入數據。