# === Оптимизированная конфигурация my.cnf для MySQL/MariaDB (на серверах Ubuntu, CentOS, Almalinux и т. д.) ===
#
# Фотис Эвангелоу, разработчик Engintron (engintron.com)
#
# ~ Обновлено в декабре 2021 г. ~
#
#
# Приведенные ниже настройки являются отправной точкой для сервера с 8–16 ГБ ОЗУ и 4–8 ядрами ЦП.
# Если у вас есть другие доступные ресурсы, вы должны настроить их соответствующим образом, чтобы сэкономить ресурсы ЦП, ОЗУ и дискового ввода-вывода.
#
# Настройки, помеченные специальным комментарием или словом "UPD" (после значения)
# следует настроить для вашей системы с помощью инструментов диагностики базы данных, таких как:
#
# github.com/major/MySQLTuner-perl
# или
# github.com/BMDan/tuning-primer.sh
#
# Запустите любой из этих скриптов перед оптимизацией вашей базы данных, по крайней мере, через 1 час после оптимизации и, наконец,
# не реже одного раза в день в течение 3 дней (без перезапуска базы данных), чтобы посмотреть, как работает ваш сервер и если вам нужно
# для повторной настройки чего-либо. Чем больше MySQL/MariaDB работает без перезапуска, тем больше данных об использовании он собирает.
# диагностические сценарии сообщат в подробностях о том, как работает MySQL/MariaDB.
#
#
# ВАЖНОЕ ПРИМЕЧАНИЕ: Если после значения параметра НЕТ комментария, то в 99,9% случаев вам не нужно его настраивать.
#
#
# --- ЧТО СДЕЛАТЬ ПОСЛЕ ОБНОВЛЕНИЯ MY.CNF – УСТРАНЕНИЕ НЕИСПРАВНОСТЕЙ ---
#
# Если упоминаются какие-либо команды терминала, убедитесь, что вы выполняете их как пользователь root.
#
# Если MySQL или MariaDB не могут запуститься (или перезапуститься), выполните следующие действия.
#
# 1. Если сервер имел стандартную конфигурацию базы данных, и вы добавляли или обновляли какие-либо
# настройки "innodb_log_*" (как предложено ниже), затем выполните ТОЛЬКО эти команды
# при первом применении этой конфигурации:
#
# $ rm -rvf /var/lib/mysql/ib_logfile*
# $ chown -R mysql:mysql /var/lib/mysql
# $ service mysql restart
#
# или используйте сокращенную команду:
# $ rm -rvf /var/lib/mysql/ib_logfile*; chown -R mysql:mysql /var/lib/mysql; service mysql restart
#
# 2. Если параметр "bind-address" не закомментирован, то убедитесь, что файл /etc/hosts
# настроен правильно. Хороший пример «чистого» файла /etc/hosts выглядит примерно так:
#
# 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
# ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# 1.2.3.4 hostname.domain.tld hostname # <-- Замените соответственно!
#
# Наконец, перезапустите службу базы данных:
#
# $ service mysql restart
#
# 3. Если служба базы данных не может перезапуститься даже после первых 2 шагов, убедитесь, что папка данных базы данных
# (общий для MySQL или MariaDB) "/var/lib/mysql" принадлежит пользователю И группе "mysql".
# Кроме того, сама папка может иметь права доступа 0751 или 0755. Чтобы исправить это, просто сделайте это:
# $ chown -R mysql:mysql /var/lib/mysql
# $ chmod 0755 /var/lib/mysql
#
# Наконец, перезапустите службу базы данных:
#
# $ service mysql restart
#
#
# ~ FIN ~
[mysql]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld]
# === Обязательные настройки ===
basedir = /usr
bind_address = 127.0.0.1 # Измените на 0.0.0.0, чтобы разрешить удаленные подключения.
datadir = /var/lib/mysql
#default_authentication_plugin = mysql_native_password # Включите в MySQL 8+ или MariaDB 10.6+ для обратной совместимости с распространенными CMS.
max_allowed_packet = 256M
max_connect_errors = 1000000
pid_file = /var/run/mysqld/mysqld.pid
port = 3306
skip_external_locking
skip_name_resolve
socket = /var/run/mysqld/mysqld.sock
tmpdir = /tmp
user = mysql
# === Режим совместимости с SQL ===
# Включить b/c с базами данных, созданными в более старых версиях MySQL/MariaDB.
# (например, при использовании нулевых дат)
#sql_mode = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES
# Дерьмовые SQL-запросы/схема? Забей!
#sql_mode = ""
# === Настройки InnoDB ===
default_storage_engine = InnoDB
innodb_buffer_pool_instances = 4 # Используйте 1 экземпляр на 1 ГБ размера пула InnoDB — максимум 64
innodb_buffer_pool_size = 4G # Используйте до 70-80% оперативной памяти
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 0
innodb_flush_method = O_DIRECT
innodb_log_buffer_size = 16M
innodb_log_file_size = 1G
innodb_sort_buffer_size = 4M # UPD - Определяет, сколько данных считывается в память для операций сортировки перед записью на диск (по умолчанию 1M / макс. 64M)
innodb_stats_on_metadata = 0
#innodb_use_fdatasync = 1 # Только (!) для MySQL v8.0.26+
#innodb_temp_data_file_path = ibtmp1:64M:autoextend:max:20G # Контролируйте максимальный размер файла ibtmp1
#innodb_thread_concurrency = 4 # Необязательно: установите количество процессоров в вашей системе (минус 1 или 2), чтобы лучше
# содержать загрузку процессора. Например. если в вашей системе 8 процессоров, попробуйте 6 или 7 и проверьте
# общую нагрузку, создаваемую MySQL/MariaDB.
innodb_read_io_threads = 64
innodb_write_io_threads = 64
#innodb_io_capacity = 2000 # Зависит от технологии хранения — используйте 2000 для SSD, больше для NVMe
#innodb_io_capacity_max = 4000 # Обычно удваивает значение innodb_io_capacity.
# === Настройки MyISAM ===
# Следующие 3 опции поддерживаются ТОЛЬКО MariaDB и до MySQL 5.7
# НЕ раскомментируйте MySQL 8.x+
#query_cache_limit = 4M # UPD
#query_cache_size = 64M # UPD
#query_cache_type = 1 # Включено по умолчанию
key_buffer_size = 24M # UPD
low_priority_updates = 1
concurrent_insert = 2
# === Connection Settings ===
max_connections = 100 # UPD - Важно: большое количество подключений = большое потребление оперативной памяти
back_log = 512
thread_cache_size = 100
thread_stack = 192K
interactive_timeout = 180
wait_timeout = 180
# Только для MySQL 5.7+ (по умолчанию отключено)
#max_execution_time = 90000 # Установите лимит времени ожидания для операторов SELECT (значение в миллисекундах).
# Этот параметр может быть полезен для борьбы с агрессивным сканированием на больших сайтах,
# но это также может вызвать проблемы (например, с резервными копиями). Так что используйте с особой осторожностью и тестируйте!
# Дополнительная информация по адресу: dev.mysql.com/doc/refman/5.7/en/server-system-variables.html.
# For MariaDB 10.1.1+ only (disabled by default)
#max_statement_time = 90 # Эквивалент «max_execution_time» в MySQL 5.7+ (установлен выше)
# Переменная имеет тип double, поэтому вы можете использовать тайм-аут в доли секунды.
# Например, вы можете использовать значение 0,01 для тайм-аута 10 миллисекунд.
# Дополнительная информация: mariadb.com/kb/en/aborting-statements/
# === Настройки буфера ===
# Удобный совет по управлению использованием оперативной памяти вашей базы данных:
# Со следующими значениями следует обращаться осторожно, так как они суммируются, а затем умножаются на ваше значение "max_connections".
# Другие параметры также увеличивают потребление оперативной памяти (например, tmp_table_size). Так что не переключайте свой «join_buffer_size» на 1G, это вредно и неэффективно.
# Используйте один из инструментов диагностики базы данных, упомянутых в начале этого файла, чтобы подсчитать потенциальное общее использование ОЗУ вашей базой данных, чтобы вы знали, находитесь ли вы в пределах
# разумные пределы. Помните, что другим службам для правильной работы потребуется достаточно оперативной памяти (например, Apache или PHP-FPM), поэтому устанавливайте ограничения с умом.
join_buffer_size = 4M # UPD
read_buffer_size = 3M # UPD
read_rnd_buffer_size = 4M # UPD
sort_buffer_size = 4M # UPD
# === Настройки таблицы ===
# В системах, управляемых systemd, таких как Ubuntu 16.04+ или CentOS 7+, вам необходимо выполнить дополнительное действие для table_open_cache и open_files_limit
# для переопределения (см. также комментарий рядом с open_files_limit).
# Например. для MySQL 5.7 проверьте: dev.mysql.com/doc/refman/5.7/en/using-systemd.html
# и для проверки MariaDB: mariadb.com/kb/en/library/systemd/
table_definition_cache = 40000 # UPD
table_open_cache = 40000 # UPD
open_files_limit = 60000 # UPD - Это может быть в 2-3 раза больше значения table_open_cache или соответствовать системному
# лимиту открытых файлов обычно устанавливается в /etc/sysctl.conf и /etc/security/limits.conf
# В системах, управляемых systemd, это ограничение также должно быть установлено в:
# - /etc/systemd/system/mysql.service.d/override.conf (for MySQL 5.7+ in Ubuntu) or
# - /etc/systemd/system/mysqld.service.d/override.conf (for MySQL 5.7+ in CentOS) or
# - /etc/systemd/system/mariadb.service.d/override.conf (для MariaDB)
# в противном случае изменение open_files_limit не будет иметь никакого эффекта.
#
# Чтобы отредактировать нужный файл, выполните:
# $ systemctl edit mysql (или mysqld или mariadb)
# и установите "LimitNOFILE=" примерно на 100000 или больше (в зависимости от ваших системных ограничений для MySQL)
# или используйте "LimitNOFILE=infinity" только для MariaDB.
# Наконец, объедините изменения с:
# $ systemctl daemon-reload; systemctl restart mysql (или mysqld или mariadb)
max_heap_table_size = 128M # Увеличьте до 256M или 512M, если у вас много временных таблиц из-за отсутствия индексов в JOIN.
tmp_table_size = 128M # Используйте то же значение, что и max_heap_table_size
# === Search Settings ===
ft_min_word_len = 3 # Минимальная длина слов для индексации результатов поиска
# === Binary Logging ===
disable_log_bin = 1 # Двоичное ведение журнала отключено по умолчанию
#log_bin # Чтобы включить ведение двоичного журнала, раскомментируйте эту строку и только одну из следующих двух строк.
# это соответствует вашей фактической версии MySQL/MariaDB.
# Не забудьте закомментировать строку с помощью «disable_log_bin».
#expire_logs_days = 1 # Хранить журналы в течение 1 дня — только для MySQL 5.x и MariaDB до 10.6.
#binlog_expire_logs_seconds = 86400 # Хранить журналы в течение 1 дня (в секундах) — только для MySQL 8+ и MariaDB 10.6+
# === Error & Slow Query Logging ===
log_error = /var/lib/mysql/mysql_error.log
log_queries_not_using_indexes = 0 # Отключено в продакшн
long_query_time = 5
slow_query_log = 0 # Отключено в продакшн
slow_query_log_file = /var/lib/mysql/mysql_slow.log
[mysqldump]
# Ссылки на переменные
# Для MySQL 5.7+: dev.mysql.com/doc/refman/5.7/en/mysqldump.html
# Для MariaDB: mariadb.com/kb/en/library/mysqldump/
quick
quote_names
max_allowed_packet = 1024M