Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MYSQL_OOM_TERMINATED Linux / DevOps

Траблшутинг падений MySQL по OOM: балансировка глобальных и сессионных буферов

Обновлено: 21.08.2026
  • Процесс mysqld внезапно завершается ночью или при пиковых нагрузках без явных ошибок в mysql.log.
  • В выводе dmesg или journalctl -k присутствует запись Out of memory: Killed process (mysqld).
  • Сервер выделяет под InnoDB Buffer Pool более 80% RAM, не оставляя памяти для сессионных подключений.

1. Формула расчета максимального потребления памяти MySQL

Max_Memory_Usage = Global_Buffers + (max_connections * Per_Thread_Buffers)

Global_Buffers = innodb_buffer_pool_size + key_buffer_size + innodb_log_buffer_size
Per_Thread_Buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size + thread_stack + binlog_cache_size

2. Корректировка буферов в /etc/mysql/my.cnf

[mysqld]
# Выделяйте под Buffer Pool не более 65-70% от общей RAM сервера
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 8

# Безопасные размеры сессионных буферов (не завышайте их!)
sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 1M
read_rnd_buffer_size = 1M

# Ограничение общего числа клиентов
max_connections = 300
max_heap_table_size = 64M
tmp_table_size = 64M

3. Защита процесса через Systemd OOMScoreAdjust

Создайте оверрайд systemctl edit mysqld:

[Service]
OOMScoreAdjust=-900
LimitMEMLOCK=infinity
systemctl daemon-reload && systemctl restart mysqld
💡 Практика специалистов: Не отключайте Swap на серверах баз данных полностью. Настройте vm.swappiness = 1-10 — это даст ядру пространство для сброса неактивных страниц и предотвратит внезапный hard-kill процесса mysqld.

Частые вопросы (FAQ)

Почему опасно выставлять sort_buffer_size в большие значения (например, 128MB)?

sort_buffer_size аллоцируется для КАЖДОГО потока, выполняющего сортировку ORDER BY/GROUP BY. 200 одновременных запросов с буфером 128MB мгновенно захватят 25GB RAM сверх Buffer Pool и вызовут OOM Killer.

Как в MySQL 8.0 ограничить суммарное потребление памяти компонентами?

Используйте глобальный параметр SET GLOBAL innodb_buffer_pool_size и контролируйте суммарное потребление через представление sys.memory_global_total.

Полезные материалы
Рекомендуем