如何提高MySQL转储还原的性能

时间:2019-12-18 12:01:11

标签: mysql

我们中的许多人正在从事其家庭或宠物项目,并且使用数据库来存储结构化数据时,在尝试转储/还原数据时可能会遇到性能问题。只是坐下来等待数十分钟甚至数小时的另一个转储还原操作可能会很烦人。

我有非常典型的机器规格-4核心i5 7300、8 Gb RAM,相当快的M2驱动器和Windows 10 / MySQL 5.7。

问题是尝试还原〜4.5Gb文件花费的时间超过4小时。这太荒谬了,我想知道mysqld进程是否没有使用一半的系统资源-CPU /内存/磁盘I / O

一般而言,该帖子是有关问题的某种摘要,包括我在下面发表的许多其他帖子的鸣谢

1 个答案:

答案 0 :(得分:1)

我使用MySQL参数进行了许多实验,以实现更好的转储还原操作

+--------------------------------+---------+---------+-----------------------+---------------------+
|           Parameter            | Default | Changed | Performance (minutes) | Perfomance gain (%) |
+--------------------------------+---------+---------+-----------------------+---------------------+
| All default                    | -       | -       | 259 min               | -                   |
| innodb_buffer_pool_size        | 8M      | 4G      | 32 min                | +709%               |
| innodb_buffer_pool_size        | 4G      | 6G      | 32 min                | ~0%                 |
| innodb_log_file_size           | 48M     | 1G      | 11 min                | +190%               |
| innodb_log_file_size           | 1G      | 2G      | 10 min                | +10%                |
| max_allowed_packet             | 4M      | 128M    | 10 min                | ~0%                 |
| innodb_flush_log_at_trx_commit | 1       | 0       | 9 min 25 sec          | +5%                 |
| innodb_thread_concurrency      | 9       | 0       | 9 min 27 sec          | ~0%                 |
| innodb_double_write            | -       | off     | 8 min 5 sec           | +18%                |
+--------------------------------+---------+---------+-----------------------+---------------------+

摘要(以获得最佳的转储还原性能)

  1. innodb_buffer_pool_size设置为RAM的一半
  2. innodb_log_file_size设置为1G
  3. innodb_flush_log_at_trx_commit设置为0
  4. 仅出于最快的性能而建议禁用innodb_double_write,应在生产时将其启用。我还发现,更改另一个相关参数innodb_flush_method不会改变性能。但这可能是Windows平台的问题。
  5. 例如,如果您具有许多外键而具有复杂的结构,则可以尝试使用InnoDB Tables的批量数据加载技巧,链接会列在页面底部
  6. 如您所见,我尝试通过将innodb_thread_concurrency设置为0(并且还将innodb_read_io_threads设置为最大值64)来提高CPU利用率,但是结果没有改变-看来{{1 }}对于多核环境而言,该过程已经非常有效。
  7. 仅还原数据(不具有表结构)也不会影响性能

我还更改了许多其他参数,但到目前为止,这些参数与转储还原操作最相关。

看似显而易见,但新手问题可能是-在哪里可以找到并设置这些设置

在Windows中,mysqld文件位于my.ini。您不会在其中找到某些设置(例如ProgramData/MySQL/MySQL Server <version>/my.ini)-没关系,只需添加到文件末尾即可。

更改设置的最佳方法是使用MySQL Workbench(innodb_double_write)。

我将功劳归功于以下帖子(以及很多类似的帖子),我认为它们非常有用

https://www.percona.com/blog/2018/02/22/restore-mysql-logical-backup-maximum-speed/ https://www.percona.com/blog/2014/01/28/10-mysql-performance-tuning-settings-after-installation/ https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html https://dba.stackexchange.com/questions/86636/when-is-it-safe-to-disable-innodb-doublewrite-buffering https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html