MySQL не может открыть файлы после обновления сервера: errno: 24

16

Ubuntu: 12.04 LTS (Linux mysql02 3.2.0-40-generic # 64-Ubuntu SMP Пн 25 марта 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux)

MySQL: дистрибутив Ubuntu 5.5.31

Apparmor: УДАЛЕНО !

Сервер работает отлично уже более года. Тогда в этот понедельник MySQL начал выходить из строя. Обновление вызвало проблему, и мы не можем понять, что это такое. Мы даже пытались откатиться до MySQL 5.5.30, но безуспешно. Мы вернулись в 5.5.31.

Записи журнала ошибок MySQL:

130430  7:55:46 [ERROR] Error in accept: Too many open files
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fclvod.frm' (errno: 24)
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fcnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcont.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcontv.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/frcfcl.frm' (errno: 24)

Похоже, мы столкнулись с проблемой ulimit. Мы полностью удалили APPARMOR. Мы увеличили /etc/security/limits.conf и все еще не повезло:

# Out of desperation....
* soft  nofile  49152
* hard  nofile  65536

# No effect!?!!?
#mysql  soft  nofile  49152
#mysql  hard  nofile  65536

И чтобы показать пределы. Работает.

root@mysql02:/etc/security# ulimit -Sa | grep "open files"
open files                      (-n) 49152

root@mysql02:/etc/security# ulimit -Ha | grep "open files"
open files                      (-n) 65536

И вот важные записи в my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

Тем не мение:

root@mysql02:/etc/mysql# mysqladmin -u root -pThePassword variables| grep open_files_limit
open_files_limit                                  | 1024

Мы в полном недоумении. Будем очень благодарны любой помощи.

фургон
источник
1
Какие сообщения об ошибках есть в журналах ДО того, как появятся слишком много открытых файлов? Вы перезапустили mysqld после изменения open_files_limit, верно?
Берт
да, мы перезапускаем MySQL каждый раз, когда вносим изменения. У нас есть одна таблица, о которой сообщается, что она отсутствует (и по какой-то причине): 30430 8:36:39 InnoDB: Ошибка: попытка открыть таблицу, но не удалось InnoDB: открыть файл табличного пространства './oti_lw_prod/apinvoice_charges .ibd '!
Ван
К вашему сведению, мы переместили наших пользователей на наш другой мастер (настройка поединка мастера) (01), и теперь он демонстрирует те же симптомы. Он (01) имел ту же самую точную конфигурацию, что и этот отказавший сервер (02), и является нашим мастером отработки отказа, если этот (02) умрет. Ну, так много для этого плана. Мы уверены, что это проблема ОС.
Ван
Я уверен, что это не сработало для Original Poster, но для меня это произошло после обновления безопасности, и перезапуска mysql было достаточно.
Kzqai

Ответы:

19

ОС: Ubuntu (Debian) развертывания

MySQL Server Option: ограничение открытых файлов

Похоже, что выскочка Debian не использует параметры, определенные в /etc/security/limits.conf , поэтому, когда вы запускаете mysql через команду service (и так, под upstart), он переопределяет эти определенные ограничения и использует значение по умолчанию 1024 ,

Решение состоит в том, чтобы изменить mysql.conf файл , который определяет службу выскочки, он расположен в /etc/init/mysql.conf и добавьте следующие строки перед в предпусковом блоке:

# NB: Upstart scripts do not respect
# /etc/security/limits.conf, so the open-file limits
# settings need to be applied here.
limit nofile 32000 32000
limit nproc 32000 32000

Ссылки:

фургон
источник
Разочарование это не где-то четко задокументировано. :( Мы только что наткнулись на сообщение Дэвида о сбое сервера.
Ван
И это не ошибка, согласно этому: bugs.launchpad.net/mysql-server/+bug/938669
Ван
Это может стать внезапным и тревожным явлением после добавления разделов в таблицы, что может привести к увеличению количества открытых файлов.
markdwhite
Это работало для меня на Ubuntu 15.10. После обновления пакетов появилось множество сообщений об ошибках «Не удается открыть файл», которые сломали все мои сайты: (... Большое спасибо за то, что избавили меня от головной боли и времени.
Эммануэль
Кто-нибудь может объяснить, что такое блок "pre-start"? Я использую Ubuntu 16 и имею эту проблему, но файл конфигурации выглядит иначе, чем раньше
billynoah
4

Была такая же проблема на Ubuntu 15.10.

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758 - принес решение:

  1. проверьте, существует ли /lib/systemd/system/mysql.service или /lib/systemd/system/mysqld.service
  2. (в моем случае) если нет, создайте /lib/systemd/system/mysql.service и скопируйте содержимое в этот файл https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/ comments / 11 и добавить две строки где-нибудь в файле

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. если один или оба файла существуют, проверьте, включены ли эти две строки:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. выполнять systemctl daemon-reload

... и все должно быть хорошо.

Хендрик Эггерс
источник
1

Поскольку ни один из вышеперечисленных вопросов не помог мне (только приводил к тому, что системе не хватало памяти), вот решение, которое я нашел:

В /etc/mysql/my.confMySQL необходимо увеличить внутренний open_files_limit. Поэтому временно добавьте это в конфигурацию и перезапустите MySQL.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

После запуска операции, которая выдает ошибку « слишком много открытых файлов» , вы можете изменить свою конфигурацию на исходную и снова перезапустить MySQL.

mniess
источник
это сработало для меня в Ubuntu 16.04, спасибо :)
Ричард Фрэнк
0

Спасибо за обходной путь. Но для меня проблема была омрачена двумя другими фактами.

  1. Мой каталог данных отличается от установки по умолчанию. По нескольким причинам, как историческим, так и техническим.
  2. Я обновлялся с очень старой установки, которая прошла через несколько обратных и прямых портов. При первом запуске недавно установленного MySQL 5.5 механизм InnoDB не был активирован (внутренняя реализация была отключена в файле конфигурации, но плагин, который был доступен в предыдущих версиях, отсутствует в 5.5), и отметка обновления была создана без фактического обновления любые столы.

После исправления проблемы InnoDB, он все еще плевался

mysql> SHOW DATABASES;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 24)

Мне пришлось запустить mysqld в корневой консоли и вручную перезапустить

/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf --force

Затем сервер начал показывать базы данных, но не смог получить доступ к некоторым таблицам. Ваш обходной путь с увеличенными лимитами устранил остальные проблемы, спасибо!

AnrDaemon
источник