MySQL nie może otwierać plików po aktualizacji serwera: errno: 24

16

Ubuntu: 12.04 LTS (Linux mysql02 3.2.0-40-generic # 64-Ubuntu SMP Mon Mar 25 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux)

MySQL: dystrybucja Ubuntu 5.5.31

Apparmor: USUNIĘTO!

Serwer działa solidnie od ponad roku. W ten poniedziałek MySQL zaczął zawodzić. Aktualizacja spowodowała problem i nie możemy ustalić, co to jest. Próbowaliśmy nawet przywrócić MySQL 5.5.30, ale bez powodzenia. Wróciliśmy o 5.5.31.

Wpisy w dzienniku błędów 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)

Wygląda na to, że mamy problem z ulimit. Całkowicie usunęliśmy APPARMOR. Zwiększyliśmy plik /etc/security/limits.conf i nadal nie mamy szczęścia:

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

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

Aby pokazać limit.conf działa:

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

A oto ważne wpisy w my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

Jednak:

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

Jesteśmy kompletnie zakłopotani i przygnębieni. Każda pomoc byłaby bardzo mile widziana.

Awangarda
źródło
1
Jakie komunikaty o błędach znajdują się w dziennikach PRZED tym o zbyt wielu otwartych plikach? Zrestartowałeś mysqld od czasu zmiany open_files_limit, prawda?
Bert
tak, restartowaliśmy MySQL za każdym razem, gdy wprowadzamy zmiany. Mamy jedną tabelę, która jest zgłaszana jako brakująca (i to z jakiegoś powodu): 30430 8:36:39 InnoDB: Błąd: próba otwarcia tabeli, ale nie można InnoDB: otworzyć plik obszaru tabel ./oti_lw_prod/apinvoice_charges .ibd '!
Van
Do Twojej wiadomości przenieśliśmy naszych użytkowników do innego serwera głównego (konfiguracja pojedynku) (01) i teraz wykazuje on dokładnie te same objawy. Miał (01) taką samą dokładną konfigurację jak serwer, który uległ awarii (02) i jest naszym głównym serwerem awaryjnym, jeśli ten (02) umrze. Cóż, tyle za ten plan. Jesteśmy prawie pewni, że to problem z systemem operacyjnym.
Van
Jestem pewien, że to nie działało w przypadku oryginalnego plakatu, ale dla mnie stało się to po aktualizacji zabezpieczeń i ponowne uruchomienie mysql wystarczyło.
Kzqai

Odpowiedzi:

19

System operacyjny: wdrożenia Ubuntu (Debian)

Opcja serwera MySQL: limit otwartych plików

Wygląda na to, że Debian upstart nie używa parametrów zdefiniowanych w /etc/security/limits.conf , więc kiedy uruchamiasz mysql za pomocą komendy service (i tak w przypadku upstart), zastępuje te zdefiniowane limity i używa domyślnej 1024 .

Rozwiązaniem jest zmodyfikowanie mysql.conf plik definiujący usługę dorobkiewicz, że znajduje się w /etc/init/mysql.conf i dodaj następujące wiersze przed tym pre-start bloku:

# 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

Bibliografia:

Awangarda
źródło
Rozczarowujące to nie jest gdzieś wyraźnie udokumentowane. :( Właśnie natrafiliśmy na post Davida o błędzie serwera.
Van
I to nie jest błąd, zgodnie z tym: bugs.launchpad.net/mysql-server/+bug/938669
Van
Może to stać się nagle i alarmująco widoczne po dodaniu partycji do tabel, co może spowodować wzrost liczby otwartych plików.
markdwhite
To działało dla mnie na Ubuntu 15.10. Po uaktualnieniu pakietów pojawiło się mnóstwo komunikatów o błędach „Nie mogę otworzyć pliku”, które zepsuły wszystkie moje strony: (... Dziękuję milionowi za zaoszczędzenie dużo bólu głowy i czasu.
Emmanuel
czy ktoś może wyjaśnić, co to jest blok „przed uruchomieniem”? Używam Ubuntu 16 i mam ten problem, ale plik konfiguracyjny wygląda inaczej niż poprzednio
billynoah
4

Miałem ten sam problem na Ubuntu 15.10.

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758 - przyniósł rozwiązanie:

  1. sprawdź, czy istnieje /lib/systemd/system/mysql.service lub /lib/systemd/system/mysqld.service
  2. (w moim przypadku), jeśli nie, utwórz /lib/systemd/system/mysql.service i skopiuj zawartość tego pliku https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/ komentarze / 11 i dodaj dwie linie gdzieś w pliku

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. jeśli istnieje jeden lub oba pliki, sprawdź, czy uwzględniono te dwa wiersze:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. wykonać systemctl daemon-reload

... i wszystko powinno być w porządku.

Hendrik Eggers
źródło
1

Ponieważ żadna z powyższych czynności nie rozwiązała problemu (prowadzi tylko do braku pamięci w systemie), oto rozwiązanie, które znalazłem:

W /etc/mysql/my.confmusisz zwiększyć MySQL wewnętrzne open_files_limit. Tymczasowo dodaj to do konfiguracji i zrestartuj MySQL.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

Po uruchomieniu operacji powodującej błąd zbyt wielu otwartych plików możesz przywrócić konfigurację do wartości domyślnej i ponownie uruchomić MySQL.

Mniess
źródło
to działało dla mnie na Ubuntu 16.04, dzięki :)
Richard Frank
0

Dziękuję za obejście. Ale dla mnie problem został przyćmiony przez dwa pozostałe fakty.

  1. Mój katalog danych różni się od domyślnej instalacji. Z wielu powodów, zarówno historycznych, jak i technicznych.
  2. Uaktualniałem z bardzo starej instalacji, która przeszła przez szereg portów tylnych i przednich. Przy pierwszym uruchomieniu nowo zainstalowanego MySQL 5.5 silnik InnoDB nie został aktywowany (wewnętrzna implementacja została wyłączona w pliku konfiguracyjnym, ale wtyczka dostępna w poprzednich wersjach nie jest obecna w wersji 5.5), a znak aktualizacji został utworzony bez faktycznej aktualizacji dowolne stoły.

Po naprawieniu problemu z InnoDB nadal plunął

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

Musiałem uruchomić mysqld w konsoli root i ręcznie zrestartować

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

Następnie serwer zaczął wyświetlać bazy danych, ale nie mógł uzyskać dostępu do niektórych tabel. Twoje obejście ze zwiększonymi limitami naprawiło resztę problemów, dziękuję!

AnrDaemon
źródło