При росте количества таблиц и баз данных в MySQL рано или поздно Вы получите ошибку: Too many open files. Данная ошибка связана с не достаточным количеством выделенных дескрипторов файлов, на уровне операционной системы или MySQL. Анализ дескрипторов Вы можете произвести командой:
В результате увидите нечто подобное:
|
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 открытых файлов. Это не большое количество и может Вас не устроить. Вы можете увидеть, сколько выделено дескрипторов:
Так же, еще вариант просмотра:
Количество выделенных дескрипторов пользователю mySQL:
Для Debian и Linux Ubuntu:
|
su mysql -s /bin/sh -c "ulimit -a" |
Увеличиваем количество дескипторов
|
vi /etc/security/limits.conf |
Заполняем таким содержимым:
|
* soft nofile 1024000 * hard nofile 1024000 * soft nproc 10240 * hard nproc 10240 |
Установка параметров, специфичных для MySQL:
|
mysql hard nofile 1024000 mysql soft nofile 1024000 |
Отредактируем файл /etc/security/limits.d/90-nproc.conf:
|
vi /etc/security/limits.d/90-nproc.conf |
Заполним файл:
|
* soft nofile 1024000 * hard nofile 1024000 * soft nproc 10240 * hard nproc 10240 root soft nproc unlimited |
Установите под root:
Теперь, перезагрузите сервер и поменяйте параметры в конфиге MySQL:
Запишите после [mysqld]:
|
[mysqld] open_files_limit = 1024000 |
Запишите после [mysqld_safe]:
|
[mysqld_safe] open_files_limit = 1024000 |
Теперь перезагрузите сервер:
Для проверки настроек в MySQL войдите:
Выполните команду:
|
show global variables like 'open%'; |
В результате, должны увидеть:
|
+------------------+--------+ | Variable_name | Value | +------------------+--------+ | open_files_limit | 1024000 | +------------------+--------+ 1 row in set (0.00 sec) |
Перезагрузите сервер и проверьте, сохранились ли настройки:
|
mysql -u root -p show global variables like 'open%'; |
Если после загрузки Вы увидите значение 1024, то не сохранились настройки. В таком случае, читайте решение проблем. Решение проблем Проверьте файл /etc/security/limits.conf он должен содержать:
|
* hard nofile 102400 * soft nofile 102400 |
Или установите лимит таким образом:
Перезагрузите MySQL:
Можно внести изменения в:
Добавьте следующее:
|
ulimit -S -n ${DAEMON_FILES_LIMIT:-102400} >/dev/null 2>&1 |
В настройках /etc/my.cnf укажите:
|
[myqld_safe] open_files_limit = 102400 |
или
|
[myqld] open_files_limit = 102400 |
Проблемы в Linux Ubuntu 15.04 Все перечисленные вещи не помогли в Linux Ubuntu 15.04. Немного погуглив, я нашел решение для Linux Ubuntu 15.04. Нужно внести изменения в файл: /lib/systemd/system/mysql.service К содержимому данного файла:
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 |
Добавьте:
|
LimitNOFILE = infinity LimitMEMLOCK = infinity |
Read more