慢速运行MySql还原 - 比备份速度慢10倍仍在继续

时间:2018-02-07 14:53:49

标签: mysql database restore database-restore

我将一个大型(~80GB)数据库从其测试平台移动到其生产环境中。我们正在开发Windows服务器。这是我们第一次使用MySQL,而且我们仍然在学习预期的行为。

我们用

备份了数据
mysqldump -u root -p --opt [database name] > [database name].sql

花了大约3个小时创建了一个45GB的文件。它一夜之间复制到新家,第二天早上,我使用MySQL Workbench启动恢复。根据它的日志,它运行

  

mysql.exe --defaults-file =" [a path] \ tmpc8tz9l.cnf" --protocol = tcp --host = 127.0.0.1 --user = [me] --port = 3306 --default-character-set = utf8 --comments --database = [database name]< " H:\ [数据库名称] .sql"

它正在工作 - 如果我连接到实例,我可以看到数据库及其表格。

麻烦的是,它似乎永远消失了。我认为它会在恢复所需的3-4个时间内恢复,可能更快,因为它可以恢复到功能更强大的SSD驱动器上。

但是现在恢复开始后大约36个小时,数据库显然是30GB。而且它似乎越来越慢。

我不想在它开始工作的时候打断它,所以我想我只需要等待。但是为了将来参考:这个糖蜜 - 慢恢复速度正常吗?下次我们需要恢复一个大数据库时,我们能做些什么来改善问题?

2 个答案:

答案 0 :(得分:2)

非常大的进口很难快速进口。听起来你的导入速度正在减慢 - 每秒处理更少的行 - 随着它的进展。这可能意味着MySQL正在检查每个新行,以查看它是否与已插入的行存在密钥冲突。

你可以做的一些事情:

开始之前,请禁用密钥检查。

   SET FOREIGN_KEY_CHECKS = 0;
   SET UNIQUE_CHECKS = 0;

结束恢复密钥检查后。

  SET UNIQUE_CHECKS = 1;
  SET FOREIGN_KEY_CHECKS = 1;

并且,如果你可以在

中包装每几千行INSERT次操作
   START TRANSACTION;
   INSERT ...
   INSERT ...
   ...
   COMMIT;

你会节省大量的磁盘搅动。

请注意,这仅适用于包含数千行或更多行的表。

可以使用

mysqldump创建一个禁用密钥的转储。 https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_disable-keys

mysqldump --disable-keys

同样,

mysqldump --extended-insert --no-autocommit

将使转储的sql文件包含有关使用事务的建议的变体。

在您的情况下,如果您使用过--opts --no-autocommit,您可能会获得最佳转储文件。您已使用--opts

答案 1 :(得分:0)

我更改了 my.ini 并获得了一些改进,同时还使用了 mysqldump --extended-insert --no-autocommit

my.ini 用于 Windows 10 mysql 7.4 上的 16GB RAM

# Comment the following if you are using InnoDB tables
#skip-innodb
innodb_data_home_dir="C:/xampp74/mysql/data"
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_group_home_dir="C:/xampp74/mysql/data"
#innodb_log_arch_dir = "C:/xampp74/mysql/data"
## You can set .._buffer_pool_size up to 50 - 80 %
## of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size=16M
innodb_buffer_pool_size=8G
## Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size=5M
innodb_log_file_size=2G
innodb_log_buffer_size=8M

#innodb_flush_log_at_trx_commit=1
#Use for restore only
innodb_flush_log_at_trx_commit=2

innodb_lock_wait_timeout=50