Ошибка слишком большого количества открытых файлов в Ubuntu 8.04 - PullRequest
12 голосов
/ 02 февраля 2009
mysqldump: Couldn't execute 'show fields from `tablename`': Out of resources when opening file './databasename/tablename#P#p125.MYD' (Errcode: 24) (23)

при проверке ошибки 24 на оболочке написано

>>perror 24

OS error code  24:  Too many open files

как мне это решить?

Ответы [ 7 ]

20 голосов
/ 26 августа 2009

Сначала, чтобы определить определенные ограничения пользователей или групп, вы должны сделать следующее:

root@ubuntu:~# sudo -u mysql bash
mysql@ubuntu:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 71680
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) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 71680
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
mysql@ubuntu:~$

Важная строка:

открытые файлы (-n) 1024

Как видите, поставщик вашей операционной системы поставляет эту версию с базовой конфигурацией Linux - 1024 файла на процесс.

Этого явно недостаточно для загруженной установки MySQL.

Теперь, чтобы исправить это, вы должны изменить следующий файл:

/ и т.д. / безопасность / limits.conf

mysql             soft    nofile           24000
mysql             hard    nofile           32000

Некоторые разновидности Linux также требуют дополнительной настройки, чтобы привязать их к процессам демона по сравнению с сеансами входа в систему. Например, в Ubuntu 10.04 вам также нужно установить пределы сеанса pam, добавив следующую строку в /etc/pam.d/common-session:

session required pam_limits.so
8 голосов
/ 16 февраля 2011

Довольно старый вопрос, но вот мои два цента.

То, что вы могли испытать, заключается в том, что движок mysql неправильно установил свою переменную "open-files-limit".

Вы можете видеть, сколько файлов вы разрешаете открывать mysql mysql> SHOW VARIABLES;

Возможно, установлено значение 1024, даже если вы уже установили ограничения на более высокие значения.

Вы можете использовать опцию --open-files-limit = XXXXX в командной строке для mysqld.

Приветствия

3 голосов
/ 10 августа 2009

добавьте --single_transaction к вашей команде mysqldump

1 голос
/ 20 октября 2013

Нет необходимости настраивать PAM, как мне кажется. В моей системе (Debian 7.2 с Percona 5.5.31-rel30.3-520.squeeze) у меня есть:

До изменения my.cnf:

\#cat /proc/12345/limits |grep "open files"
Max open files            1186                 1186                 files

После добавления open_files_limit = 4096 в my.cnf и перезапуска mysqld я получил:

\#cat /proc/23456/limits |grep "open files"
Max open files            4096                 4096                 files

12345 и 23456 - это, конечно, PID процесса mysqld.

SHOW VARIABLES LIKE 'open_files_limit' теперь показывают 4096.

Все выглядит нормально, пока "ulimit" не показывает изменений:

\# su - mysql -c bash
\# ulimit -n
1024
1 голос
/ 02 февраля 2009

Вы можете увеличить ограничения ОС, отредактировав /etc/security/limits.conf.

Вы также можете установить команду " lsof " (LiSt Open Files), чтобы увидеть отношение файлов <-> Процессы.

1 голос
/ 02 февраля 2009

Также возможно, что какой-то код, который обращается к таблицам, не закрывает их должным образом, и через некоторое время может быть достигнуто количество открытых файлов.

Пожалуйста, обратитесь к http://dev.mysql.com/doc/refman/5.0/en/table-cache.html для возможной причины.

Перезапуск mysql должен заставить эту проблему исчезнуть (хотя это может произойти снова, если основная проблема не будет устранена).

0 голосов
/ 02 февраля 2009

Нет гарантии, что «24» - это номер ошибки на уровне ОС, поэтому не думайте, что это означает, что открыто слишком много файловых дескрипторов. Это может быть некоторый тип внутреннего кода ошибки, используемого в самом mysql. Я бы посоветовал спросить об этом в списках рассылки mysql.

...