繁体   English   中英

无法从 mysql 数据库转储恢复

[英]Unable to restore from mysql database dump

我已经转储了我的数据库,其中一个表非常大(大约 400 万条记录)并且具有大量索引(一个全文索引以及一个主键和 3 个唯一索引)。 当我尝试恢复此转储时,当它尝试执行启用键(ALTER table 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)

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

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

解决这个问题的方法是让您的 MySQL 服务器使用更多空间进行排序。 这是由一些服务器变量控制的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM