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

Dav*_*gac 34 mysql backup restore

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

有没有人有任何想法可能导致急剧放缓?

是否有任何 MySQL 变量可以更改以在恢复过程中加快恢复速度?

Mar*_*mos 33

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

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

  • key_buffer_size 用于 MYISAM。 (5认同)
  • 我发现两件事:key_buffer_size 设置为 8MB,并且有一个 InnoDB 表与外键混合在一起。将 key_buffer_size 增加到 1GB 并暂时关闭外键检查。恢复在 5 分钟内完成。谢谢! (2认同)
  • 我只是注意到我输入了“5”分钟。我很确定这更像是 50 分钟,但仍然更合理;-) (2认同)

小智 31

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

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;
Run Code Online (Sandbox Code Playgroud)

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

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

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

  • 这有很大帮助。我没有编辑文件,而是从上面的片段创建了 pre.sql 和 post.sql 并用它来恢复数据库:`cat pre.sql dump.sql post.sql | mysql ...` (11认同)