我将一个大型(~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。而且它似乎越来越慢。
我不想在它开始工作的时候打断它,所以我想我只需要等待。但是为了将来参考:这个糖蜜 - 慢恢复速度正常吗?下次我们需要恢复一个大数据库时,我们能做些什么来改善问题?
答案 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