Как ускорить перезапуск MySQL?

С ростом перезапуск MySQL может превратиться в очень неприятный процесс. Вам нужно поменять всего одну настройку, а вы ждете 10...20 минут, пока БД перезапустится.

На скорость выключения и включения MySQL большое влияние оказывает движок InnoDB. А именно два его компонента:

С ростом базы данных эти настройки обычно увеличивают для повышения производительности. Но вместе с этим увеличивается и время перезапуска сервера.

Ускорение выключения

Если вы обновите какую-то строку в какой-то таблице, Mysql сделает следующее:

  1. Обновит эти данные в буфере (только в оперативной памяти).
  2. Пометит эту область памяти (страницу), как "грязную".
  3. Добавит запись об изменении в redo лог файл (на случай, если сервер сломается и нужно будет восстанавливать данные).

Так обеспечивается производительность, ведь базе данных не приходится выполнять дорогие операции random-записи на диск сразу. Позже, когда буфер будет переполнен, Mysql начнет "сбрасывать грязные" страницы на диск — записывать изменения из буфера в файлы таблиц на диске.

mysql> SHOW GLOBAL STATUS LIKE '%pages_d%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| Innodb_buffer_pool_pages_data  | 1507306 |
| Innodb_buffer_pool_pages_dirty | 143393  |
+--------------------------------+---------+

# Количество грязных страниц в буфере

Как видим, количество грязных страниц составляет около 10% всего буфера. И если размер небольшой — это может быть несколько десятков мегабайт. В .io, в некоторых конфигурациях мы используем размеры буфера в 48Гб. Это означает, что размер грязных страниц составит приблизительно 5Гб.

Перед выключением Mysql обязательно сбросит все грязные страницы на диск. Отсюда и очень долгое время выключения.

В Mysql 5.7 есть настройка innodb_max_dirty_pages_pct, которая позволяет регулировать количество грязных страниц в памяти. Mysql будет чаще сбрасывать грязные страницы во время работы, если установить значение поменьше:

mysql> SET GLOBAL innodb_max_dirty_pages_pct = 1;

# Установим лимит грязных страниц в 1%

Сразу после обновления этой настройки мы увидим, что количество грязных страниц постепенно уменьшится:

mysql> SHOW GLOBAL STATUS LIKE '%pages_d%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| Innodb_buffer_pool_pages_data  | 1507306 |
| Innodb_buffer_pool_pages_dirty | 19758  |
+--------------------------------+---------+

# Значение будет постепенно уменьшаться до предела в 1%

Теперь время выключения Mysql значительно снизится.

Ускорение запуска

Сразу после запуска Mysql может очень медленно работать от нескольких минут до нескольких часов. И это при стандартной нагрузке. Это происходит потому, что какое-то время уходит на разогрев буфера. В течение этого времени буфер не наполнен, и Mysql читает множество данных напрямую с диска.

Начиная с версии 5.7 Mysql позволяет настроить включить две опции:

innodb_buffer_pool_dump_at_shutdown = ON

# Включается в my.cnf

Этот параметр сбрасывает содержимое буфера на диск перед выключением. Так, во время включения, Mysql сможет быстро загрузить этот же буфер обратно в память. Операция эта очень эффективна, т.к. сам буфер не копируется, а сохраняются только адреса страниц на диске.

innodb_buffer_pool_load_at_startup = ON

# Тоже включается в my.cnf

Этот параметр загружает содержимое буфера с диска сразу после включения. Эта операция не блокирует запуск сервера, а выполняется на фоне. Поэтому она никак не замедлит скорость запуска. А вот скорость возврата к нормальной работе увеличится в несколько раз.

TL;DR

Чтобы ускорить время выключения Mysql, сократите количество грязных страниц в памяти:

mysql> SET GLOBAL innodb_max_dirty_pages_pct = 1;

Для ускорения запуска включайте опции быстрого сброса и восстановления буфера:


innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup = ON

Эти настройки предназначены для баз данных, использующих движок InnoDB и 5.7+ версию Mysql.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень