MySQL non può aprire i file dopo l'aggiornamento del server: errno: 24


16

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

MySQL: Ubuntu distro 5.5.31

Apparmor: RIMOSSO!

Il server funziona da oltre un anno. Quindi questo lunedì MySQL ha iniziato a fallire. Un aggiornamento ha causato il problema e non possiamo capire di cosa si tratti. Abbiamo anche provato a tornare a MySQL 5.5.30 ma senza fortuna. Siamo tornati alle 5.5.31.

Voci del registro errori 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)

Sembra che stiamo riscontrando un problema con ulimit. Abbiamo rimosso completamente APPARMOR. Abbiamo aumentato /etc/security/limits.conf e non abbiamo ancora avuto fortuna:

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

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

E per mostrare il limits.conf funziona:

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

E qui ci sono le voci importanti in my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

Tuttavia:

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

Siamo totalmente sconcertati. Qualsiasi aiuto sarebbe molto apprezzato.


1
Quali messaggi di errore ci sono nei registri PRIMA di quello relativo a Troppi file aperti? Hai riavviato mysqld da quando hai cambiato open_files_limit, giusto?
— Bert,

sì, abbiamo riavviato MySQL ogni volta che apportiamo modifiche. Abbiamo una tabella che viene segnalata come mancante (ed è per qualche motivo): 30430 8:36:39 InnoDB: errore: tentativo di aprire una tabella, ma Impossibile InnoDB: aprire il file tablespace './oti_lw_prod/apinvoice_charges .ibd '!
— Van

Cordiali saluti, abbiamo spostato i nostri utenti sull'altro server master (duel master setup) sever (01) e ora presenta gli stessi identici sintomi. (01) aveva la stessa configurazione esatta di questo server in errore (02) ed è il nostro failover master se questo (02) dovesse morire. Bene, così tanto per quel piano. Siamo abbastanza sicuri che si tratti di un problema con il sistema operativo.
— Van,

Sono sicuro che questo non ha funzionato per il Poster originale, ma per me questo è successo dopo un aggiornamento di sicurezza e il riavvio di mysql è stato sufficiente.
— Kzqai,

Risposte:


19

Sistema operativo: distribuzioni Ubuntu (Debian)

Opzione server MySQL: limite di file aperti

Sembra che il Debian upstart non usi i parametri definiti in /etc/security/limits.conf , quindi quando si avvia mysql tramite il comando di servizio (e quindi, in upstart), ignora quei limiti definiti e usa il valore predefinito 1024 .

La soluzione è modificare il file mysql.conf che definisce il servizio di avvio , si trova in /etc/init/mysql.conf e aggiungere le seguenti righe prima del blocco pre-avvio :

# 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

Riferimenti:


Deludente questo non è documentato chiaramente da qualche parte. :( Siamo appena capitati sul post di David su serverfault.
— Van

E questo non è un bug, secondo questo: bugs.launchpad.net/mysql-server/+bug/938669
— Van

Ciò può diventare improvvisamente e in modo allarmante, evidente dopo l'aggiunta di partizioni alle tabelle che può causare un aumento dei file aperti.
— markdwhite,

Questo ha funzionato per me su Ubuntu 15.10. Dopo aver aggiornato i pacchetti ho ricevuto tonnellate di messaggi di errore "Impossibile aprire il file", che hanno rotto tutti i miei siti: (... Grazie mille per avermi risparmiato un sacco di mal di testa e tempo.
— Emmanuel

qualcuno può spiegare qual è il blocco "pre-avvio"? Sto eseguendo Ubuntu 16 e ho questo problema, ma il file di configurazione sembra diverso rispetto a prima
— billynoah

4

Ha avuto lo stesso problema su Ubuntu 15.10.

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758 - ha portato la soluzione:

  1. controlla se esiste /lib/systemd/system/mysql.service o /lib/systemd/system/mysqld.service
  2. (nel mio caso) in caso contrario, creare /lib/systemd/system/mysql.service e copiare il contenuto di questo file https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/ commenti / 11 e aggiungi le due righe da qualche parte nel file

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. se uno o entrambi i file esistono, controlla se sono incluse queste due righe:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. eseguire systemctl daemon-reload

... e tutto dovrebbe andare bene.


1

Poiché nessuno dei precedenti ha risolto il problema per me (porta solo al sistema a corto di memoria), ecco la soluzione che ho trovato:

In /etc/mysql/my.confè necessario aumentare MySQL interni open_files_limit. Quindi aggiungi temporaneamente questo alla configurazione e riavvia MySQL.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

Dopo aver eseguito l'operazione che ti dà troppi errori di file aperti , puoi ripristinare la configurazione predefinita e riavviare MySQL.


questo ha funzionato per me su Ubuntu 16.04, grazie :)
— Richard Frank,

0

Grazie per la soluzione alternativa. Ma per me, il problema è stato oscurato da altri due fatti.

  1. La mia directory di dati è diversa dall'installazione predefinita. Per molteplici ragioni, sia storiche che tecniche.
  2. Stavo aggiornando da un'installazione molto vecchia, che ha attraversato un certo numero di porte back e forward. Al primo avvio di un MySQL 5.5 appena installato, il motore InnoDB non è stato attivato (l'implementazione interna è stata disabilitata nel file di configurazione, ma il plug-in che era disponibile nelle versioni precedenti non è presente in 5.5) e il segno di aggiornamento è stato creato senza effettivamente aggiornare eventuali tavoli.

Dopo aver risolto il problema di InnoDB, stava ancora sputando

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

Ho dovuto avviare mysqld nella console di root e riavviare manualmente

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

Quindi il server ha iniziato a mostrare i database, ma non è stato in grado di accedere ad alcune tabelle. La tua soluzione alternativa con limiti aumentati ha risolto il resto dei problemi, grazie!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.