При росте количества таблиц и баз данных в MySQL рано или поздно Вы получите ошибку: Too many open files. Данная ошибка связана с не достаточным количеством выделенных дескрипторов файлов, на уровне операционной системы или MySQL.
Анализ дескрипторов Вы можете произвести командой:
1 |
ulimit -a |
В результате увидите нечто подобное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 257403 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 257403 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited |
Как видите, в данном случае выдалось 1024 открытых файлов. Это не большое количество и может Вас не устроить.
Вы можете увидеть, сколько выделено дескрипторов:
1 |
ulimit -n |
Так же, еще вариант просмотра:
1 2 |
ulimit -Hn ulimit -Sn |
Количество выделенных дескрипторов пользователю mySQL:
1 2 |
su mysql ulimit -a |
Для Debian и Linux Ubuntu:
1 |
su mysql -s /bin/sh -c "ulimit -a" |
Увеличиваем количество дескипторов
1 |
vi /etc/security/limits.conf |
Заполняем таким содержимым:
1 2 3 4 |
* soft nofile 1024000 * hard nofile 1024000 * soft nproc 10240 * hard nproc 10240 |
Установка параметров, специфичных для MySQL:
1 2 |
mysql hard nofile 1024000 mysql soft nofile 1024000 |
Отредактируем файл /etc/security/limits.d/90-nproc.conf:
1 |
vi /etc/security/limits.d/90-nproc.conf |
Заполним файл:
1 2 3 4 5 |
* soft nofile 1024000 * hard nofile 1024000 * soft nproc 10240 * hard nproc 10240 root soft nproc unlimited |
Установите под root:
1 |
ulimit -Hn 1024000 |
Теперь, перезагрузите сервер и поменяйте параметры в конфиге MySQL:
1 |
vi /etc/my.cnf |
Запишите после [mysqld]:
1 2 |
[mysqld] open_files_limit = 1024000 |
Запишите после [mysqld_safe]:
1 2 |
[mysqld_safe] open_files_limit = 1024000 |
Теперь перезагрузите сервер:
1 |
service mysqld restart |
Для проверки настроек в MySQL войдите:
1 |
mysql -u root -p |
Выполните команду:
1 |
show global variables like 'open%'; |
В результате, должны увидеть:
1 2 3 4 5 6 |
+------------------+--------+ | Variable_name | Value | +------------------+--------+ | open_files_limit | 1024000 | +------------------+--------+ 1 row in set (0.00 sec) |
Перезагрузите сервер и проверьте, сохранились ли настройки:
1 2 |
mysql -u root -p show global variables like 'open%'; |
Если после загрузки Вы увидите значение 1024, то не сохранились настройки. В таком случае, читайте решение проблем.
Решение проблем
Проверьте файл /etc/security/limits.conf он должен содержать:
1 2 |
* hard nofile 102400 * soft nofile 102400 |
Или установите лимит таким образом:
1 |
ulimit -Hn 102400 |
Перезагрузите MySQL:
1 |
service mysqld restart |
Можно внести изменения в:
1 |
vi /etc/init.d/mysqld |
Добавьте следующее:
1 |
ulimit -S -n ${DAEMON_FILES_LIMIT:-102400} >/dev/null 2>&1 |
В настройках /etc/my.cnf укажите:
1 2 |
[myqld_safe] open_files_limit = 102400 |
или
1 2 |
[myqld] open_files_limit = 102400 |
Проблемы в Linux Ubuntu 15.04
Все перечисленные вещи не помогли в Linux Ubuntu 15.04. Немного погуглив, я нашел решение для Linux Ubuntu 15.04.
Нужно внести изменения в файл: /lib/systemd/
К содержимому данного файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[Unit] Description=MySQL Community Server After=network.target After=syslog.target [Install] WantedBy=multi-user.target Alias=mysql.service [Service] User=mysql Group=mysql PermissionsStartOnly=true ExecStartPre=/usr/share/mysql/mysql-systemd-start pre ExecStart=/usr/bin/mysqld_safe ExecStartPost=/usr/share/mysql/mysql-systemd-start post TimeoutSec=600 Restart=on-failure |
Добавьте:
1 2 |
LimitNOFILE = infinity LimitMEMLOCK = infinity |
Leave a Reply