Как ускорить перезапуск 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.

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

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024