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

admin

С ростом перезапуск 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

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

<h2>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.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023