慢速 运行 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
我正在将一个大型 (~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