如何加快转储文件的MySQL还原速度?


28

我正在将30GB数据库从mysqldump文件还原到新服务器上的空数据库。从转储文件运行SQL时,还原会非常迅速地开始,然后开始变得越来越慢。单个插入现在需要15秒钟以上。这些表大多是MyISAM,带有一个小的InnoDB。服务器没有其他活动连接。SHOW PROCESSLIST;仅显示还原中的插入内容(以及显示进程列表本身)。

有谁知道会导致急剧放缓的原因吗?

是否有可以更改的MySQL变量可以加快恢复速度?


编辑以更正表格类型
Dave Forgac 2010年

Answers:


26

可能会使进程变慢的一件事是key_buffer_size,它是用于索引块的缓冲区的大小。将其调整到至少RAM的30%,否则重新索引过程可能太慢。

作为参考,如果您使用的是InnoDB和外键,则还可以禁用外键检查并在最后将其重新启用(使用SET FOREIGN_KEY_CHECKS=0SET FOREIGN_KEY_CHECKS=1)。


1
我发现了两件事:key_buffer_size设置为8MB,并且在与外键的混合中有一个InnoDB表。将key_buffer_size增加到1GB,并暂时关闭外键检查。还原在5分钟内完成。谢谢!
戴夫·福加克

哇!很高兴:)
Marco Ramos 2010年

2
我只是注意到我输入了“ 5”分钟。我很确定这更像是50分钟,但仍然更合理;-)
Dave Forgac 2013年

5
key_buffer_size用于MYISAM。
Fernando Fabreti

@FernandoFabreti-这对许多读者来说很重要,但是OP确实指定了他们大部分是MyISAM
mc0e

22

此链接显示了可以采取哪些措施来加快恢复过程。

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

可以将命令放在转储文件的顶部

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

并将这些语句放在转储文件的末尾

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

这对我有用。恢复愉快:-)


8
这很有帮助。我没有编辑文件,而是从上面的片段创建了pre.sql和post.sql,并将其用于还原数据库:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs

1

我可以想象为什么还原将逐渐变慢的唯一原因是索引。研究关闭索引直到结束,然后让它一次完成全部工作。


1

如果您具有转储文件的物理副本(DB目录),则只要新服务器具有相同的MySQL版本,就可以将其复制到新服务器,并且可以正常工作。MyISAM可以很好地工作,对我来说,这比基于逻辑SQL转储文件还原数据更好。


0

如果您有多个表,则可能会受益于mk-parallel-restore


现在已不推荐使用此方法,仅应将其用于还原测试数据,而不能用于还原实际备份。
svandragt

0

这样可以:

mysql --init-command =“ SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;” -u root -p <Backup_Database.mysql


-1

我建议你

  1. 检查您的表:是否有触发器?清除所有触发器
  2. SET: ,AUTOCOMMIT=0,(UNIQUE_CHECKS=0 并且不要忘记回滚这改变FOREIGN_KEY_CHECKS=0
  3. 使用命令行之类的 mysql -u root -pPasss requests < mydb.sql
  4. 检查您的数据库文件大小

祝好运

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.