Решение проблемы Could not increase number of max_open_files в MySQL

Содержание

Введение

Для настройки large_pages в Percona XtraDB Cluster Server понадобилось прописать в файл mysql.service строчку AmbientCapabilities=CAP_IPC_LOCK. Однако оказалось, что для Percona XtraDB Cluster Server 5.7 нет файла mysql.service, а используется скрипт /etc/init.d/mysql. В качестве прототипа был взят файл mysql.servece от Percona Server 5.7:

#
# Percona Server systemd service file
#

[Unit]
Description=Percona Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=mysql
Group=mysql
PermissionsStartOnly=true
EnvironmentFile=-/etc/default/mysql
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
ExecStartPre=/usr/bin/ps_mysqld_helper
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
TimeoutSec=0
Restart=on-failure
RestartPreventExitStatus=1

Для редактирования service-файла можно воспользоваться следующей командой:

# systemctl edit --full mysql

Скрипт /usr/bin/ps_mysqld_helper предназначен для настройки плагина TokuDB и в Percona XtraDB Cluster Server отсутствует, т.к. этот плагин им не поддерживается. Нужно удалить из service-файла строчку с этим скриптом.

Кроме того, можно поправить описание сервиса в комментариях в начале файла и в строчке Description - вместо Percona Server прописать Percona XtraDB Cluster Server.

После этого можно добавить в файл желаемую строчку AmbientCapabilities=CAP_IPC_LOCK.

Для того, чтобы сообщить systemd о том, что service-файл изменился, воспользуемся такой командой:

# systemctl daemon-reload

Проблема

Если воспользоваться получившимся service-файлом, то можно столкнуться с проблемой: значение переменной max_connections может быть усечено по сравнению со значением, указанным в файле конфигурации. Если заглянуть в файл /var/log/mysql/error.log, то в нём можно найти предупреждения следующего вида:

2023-10-19T05:48:08.615570Z 0 [Warning] Could not increase number of max_open_files to more than 1024 (request: 16000)
2023-10-19T05:48:08.616141Z 0 [Warning] Changed limits: max_connections: 214 (requested 805)
2023-10-19T05:48:08.616151Z 0 [Warning] Changed limits: table_open_cache: 400 (requested 2000)

Решение проблемы

Для решения проблемы нужно снять ограничение на максимальное количество файлов, открытых пользователем. Для этого снова отредактируем service-файл и добавим в него строчку следующего вида:

LimitNOFILE=infinity

Итоговый service-файл

После всех доработок у меня получился следующий service-файл:

#
# Percona XtraDB Cluster Server systemd service file
#

[Unit]
Description=Percona XtraDB Cluster Server
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=mysql
Group=mysql
PermissionsStartOnly=true
EnvironmentFile=-/etc/default/mysql
LimitNOFILE=infinity
AmbientCapabilities=CAP_IPC_LOCK
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
TimeoutSec=0
Restart=on-failure
RestartPreventExitStatus=1