Слишком много ошибок открытых файлов на Ubuntu 8.04
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
как я могу это решить?
Ответы
Ответ 1
Сначала, чтобы определить определенные ограничения для пользователей или групп, вы должны сделать следующее:
[email protected]:~# sudo -u mysql bash
[email protected]:~$ 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
[email protected]:~$
Важная строка:
открыть файлы (-n) 1024
Как вы можете видеть, поставщик вашей операционной системы отправляет эту версию с базовой конфигурацией Linux - 1024 файла на процесс.
Этого явно недостаточно для загруженной установки MySQL.
Теперь, чтобы исправить это, вы должны изменить следующий файл:
/etc/security/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
Ответ 2
Довольно старый вопрос, но вот мои два цента.
То, что вы могли испытывать, - это то, что движок mysql не задал свою переменную "open-files-limit" правильно.
Вы можете видеть, сколько файлов вы разрешаете mysql
mysql > SHOW VARIABLES;
Вероятно, установлено значение 1024, даже если вы уже установили ограничения на более высокие значения.
Вы можете использовать опцию --open-files-limit = XXXXX в командной строке для mysqld.
Приветствия
Ответ 3
Также может быть возможно, что некоторым кодом, который обращается к таблицам, закроет их должным образом и за определенный промежуток времени, можно будет достигнуть количества открытых файлов.
Пожалуйста, обратитесь к http://dev.mysql.com/doc/refman/5.0/en/table-cache.html по возможной причине.
Перезапуск mysql должен привести к тому, что эта проблема исчезнет (хотя это может повториться, если основная проблема не будет устранена).
Ответ 4
Вы можете увеличить свои пределы ОС, отредактировав /etc/security/limits.conf.
Вы также можете установить команду lsof" (LiSt Open Files), чтобы увидеть отношение файлов ↔ Processes.
Ответ 5
добавить --single_transaction к вашей команде mysqldump
Ответ 6
Нет необходимости настраивать 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 - это идентификатор процесса mysqld, конечно.
ПОКАЖИТЕ ПЕРЕМЕННЫЕ, КАК "open_files_limit" покажет 4096.
Все выглядит нормально, а "ulimit" не показывает изменений:
\# su - mysql -c bash
\# ulimit -n
1024
Ответ 7
Нет гарантии, что "24" - это номер ошибки на уровне ОС, поэтому не предполагайте, что это означает, что слишком много ручек файлов открыты. Это может быть некоторый тип внутреннего кода ошибки, который используется в самой mysql. Я предлагаю просить список рассылки mysql об этом.