MYSQL 备份的恢复非常慢

Kno*_*uch 1 backup restore mysql

我正在 MacOS 上运行的 16 GB RAM MySQL 上恢复 26GB mysql 转储文件。

首先我尝试像这样恢复mysql备份

mysql -ufoo -pbar foo < foo.dump
Run Code Online (Sandbox Code Playgroud)

这导致 mySQL 崩溃,因为 foo.dump 包含许多非常有趣的国际字符,并且上面的命令没有处理编码。

所以我尝试了

mysql -uroot -p --default-character-set=utf8 foo
mysql> SET names 'utf8'
mysql> SOURCE foo.dump
Run Code Online (Sandbox Code Playgroud)

这很有效,并且恢复过程没有崩溃,因为我猜有趣的国际字符已正确处理。

但现在恢复过程非常缓慢。对于 26 GB 的文件,它会运行一整夜(罪魁祸首是一张拥有 4000 万行的表)。我可以看到它每 15 秒恢复大约 3000 行。但按照这个速度,恢复过程将永远持续下去。

那么有没有一种方法可以快速恢复转储文件而不弄乱编码呢?

小智 5

由于I/OSQL 操作的磁盘活动繁重,您的进程很慢。您需要针对密集操作优化 innodb。修改你的 mysql 配置文件以包含以下几行:

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
Run Code Online (Sandbox Code Playgroud)

innodb_buffer_pool_size: InnoDB缓存表和索引数据的内存区域。当表数据缓存在InnoDB缓冲池中时,可以通过查询重复访问它,而不需要任何磁盘I/O。数据更改会被缓存,而不是立即写入磁盘。

更大的缓冲池需要更少的磁盘 I/O 来多次访问相同的表数据。在专用数据库服务器上,您可以将缓冲池大小设置为计算机物理内存的 80%,否则使用50 to 75系统内存的百分比。默认缓冲池大小为 128MB

innodb_log_buffer_size: InnoDB 用于写入磁盘上日志文件的缓冲区大小(以字节为单位)。

大的日志缓冲区允许大型事务运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有更新、插入或删除许多行的事务,则增大日志缓冲区可以节省磁盘 I/O。

innodb_log_file_size:日志组中每个日志文件的大小(以字节为单位)。大的大小可确保服务器可以平滑工作负载活动的高峰和低谷,这通常意味着有足够的重做日志空间来处理一个多小时的写入活动。值越大,缓冲池中需要的检查点刷新活动越少,从而节省磁盘 I/O

Innodb_write_io_threads: InnoDB中写操作的I/O线程数。默认值为4。InnoDB使用后台线程来服务各种类型的I/O请求。。您可以使用 innodb_read_io_threads 和 innodb_write_io_threads 配置参数来配置为数据页上的读写 I/O 提供服务的后台线程的数量。

这些参数分别表示用于读取和写入请求的后台线程数。每个后台线程最多可以处理 256 个待处理的 I/O 请求。