СправошнаяПоиск

Оптимизированная конфигурация (my.cnf) для MySQL/MariaDB (на серверах Ubuntu, CentOS, Almalinux и т. д.)

# === Оптимизированная конфигурация 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