无法从mysql数据库转储中恢复

时间:2010-03-05 13:25:34

标签: mysql mysqli mysqldump

我已经转储了我的数据库,其中一个表非常庞大(大约400万条记录)并且索引数量很多(一个全文索引以及一个主键和3个唯一索引)。当我尝试恢复此转储时,当它尝试执行启用密钥的语句(ALTER表x ENABLE键)时,恢复挂起(它现在已经运行了五天)。

有关如何恢复此转储的任何建议都非常受欢迎。表格中 问题是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)

由于

2 个答案:

答案 0 :(得分:1)

它如此慢的原因是alter table使用“使用keycache修复”来构建索引。这通过一次向索引添加一个条目来构建索引。

更快捷的方法是使用“使用排序修复”。但是,MySQL需要有大量的内存和临时磁盘空间来完成这项工作,而通常会发生的事情是MySQL将使用“排序”方法开始,空间不足,然后回到“keycache”方法

方法是允许MySQL服务器使用更多空间进行排序。这由一些服务器变量控制:

这些都是动态变量,但是我怀疑在alter table启动后更改它们会有很多好处。如果您不想更改系统配置,那么另一种方法是使用myisamchk在修复模式下构建索引,分配大型排序缓冲区。

答案 1 :(得分:0)

PostgreSQL不支持“alter table x enable keys”语句:

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转储和导入数据。