所以我做了mysqldump
一个非常大的数据库,我现在正在尝试使用以下方法恢复它:
mysql db_test < db_test.sql
但看起来它不会在今年年底前结束。现在已经大约一个小时了,仍然在“恢复”。进行备份大约需要 10 分钟,所以我担心发生了一些不好的事情。
至今:
- 我已经检查过它
mysqld
正在消耗我的 cpu(有时高达 80%)。 - 日志中没有任何相关内容。
我可以看到创建并填充了大量表的数据库(不是所有表)。此外,当我执行时
use db_test;
,我收到以下消息:读取表信息以完成表名和列名您可以使用 -A 关闭此功能以获得更快的启动
- 大约 25GB 的原始 db 文件在整个小时后
df -h
返回与以前相同的可用空间。所以我猜它在磁盘上没有做任何事情。
奇怪的是,在检查时top
,我发现kworker
有时会消耗高达 100% 的 cpu,这不应该发生
有什么想法或我能做些什么来看看发生了什么吗?
听起来底层磁盘很忙。恢复大型数据库的问题是每个(组)INSERT 都需要刷新/同步操作,这在机械磁盘上非常慢(7200 RPM 磁盘大约为 100 IOPS)。
为了加快恢复,您必须临时指示 MySQL/MariaDB不要发出刷新/同步。为此,请中断恢复并
/etc/my.ini
使用以下两行进行编辑:innodb_flush_method=nosync
innodb_flush_log_at_trx_commit=2
然后重新启动 MariaDB 并重试还原。现在事情应该进展得更快了。
还原后,删除上面的行,否则您的数据库将有一个短暂而糟糕的生命周期:由于非常重要的原因而存在刷新/同步。虽然关闭它们以进行恢复是可以接受的,但生产数据库不应该在没有它们的情况下运行。
如果您的底层存储是普通的旧磁盘,对于一个 25GB 磁盘上的 MySQL 数据库,经历数小时的恢复是很正常的——尤其是对于一些结构不良的数据库(大量的元组、索引等)。
首先压缩你的转储,这样可以节省大量的 I/O 并减少缓存内存的压力:
在你的情况下,因为你已经做了 mysqldump :
除了您的系统性能(存储、RAM 等)之外,MySQL 设置可能会产生巨大影响。但这是一个完整的专业知识,没有什么可以通过 ServerFault 问题来处理......