慢速 运行 MySql 恢复 - 比备份速度慢 10 倍并且仍在继续

Slow running MySql restore - 10 times slower than backup speed and still going

我正在将一个大型 (~80GB) 数据库从其测试平台移至其生产环境中。我们正在 Windows 服务器上工作。这是我们第一次与 MySQL 合作,我们仍在学习预期的行为。

我们用

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

创建了一个大小为 45GB 的文件,耗时约 3 小时。它连夜复制到新家,第二天早上,我使用 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:\[database name].sql"

它正在运行 - 如果我连接到实例,我可以看到数据库和它的一些表。

麻烦的是,它似乎要花很长时间。我认为它会在与备份相同的 3-4 时间范围内恢复,可能更快,因为它正在恢复到具有 SSD 驱动器的更强大的服务器上。

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

我不想打断它,因为它已经开始工作了,所以我想我只能等待。但供日后参考:这种糖浆般缓慢的恢复速度正常吗?下次我们需要恢复大数据库时,有什么可以改进的吗?

众所周知,非常大的进口产品很难快速生产。听起来您的导入速度越来越慢——每秒处理的行数越来越少——随着它的进行。这可能意味着 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.

我更改了 my.ini 并在使用 mysqldump --extended-insert --no-autocommit

的同时获得了一些改进

my.ini 16GB 内存 Windows 10 mysql 7.4

# 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