MySQL no puede abrir archivos después de actualizar el servidor: errno: 24

16

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

MySQL: distribución de Ubuntu 5.5.31

Apparmor: ¡ ELIMINADO !

El servidor lleva más de un año funcionando como una roca sólida. Entonces este lunes MySQL comenzó a fallar. Una actualización ha causado el problema y no podemos resolver qué es. Incluso hemos tratado de volver a MySQL 5.5.30 pero sin suerte. Regresamos a las 5.5.31.

Entradas de registro de errores de 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)

Parece que nos encontramos con un problema ulimit. Hemos eliminado APPARMOR por completo. Hemos aumentado /etc/security/limits.conf y aún no hemos tenido suerte:

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

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

Y para mostrar los límites.conf está funcionando:

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

Y aquí están las entradas importantes en my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

Sin embargo:

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

Estamos totalmente perplejos y deprimidos. Cualquier ayuda sería muy apreciada.

camioneta
fuente
1
¿Qué mensajes de error hay en los registros ANTES del mensaje sobre Demasiados archivos abiertos? Has reiniciado mysqld desde que cambias open_files_limit, ¿verdad?
Bert
Sí, hemos reiniciado MySQL cada vez que hacemos cambios. Tenemos una tabla que se informa como faltante (y es por alguna razón): 30430 8:36:39 InnoDB: Error: tratando de abrir una tabla, pero no pudo InnoDB: abrir el archivo de espacio de tabla './oti_lw_prod/apinvoice_charges .ibd '!
Van
Para su información, trasladamos a nuestros usuarios a nuestro otro servidor maestro (configuración de maestro de duelo) (01) y ahora muestra exactamente los mismos síntomas. (01) tenía la misma configuración exacta que este servidor que falla (02) y es nuestra falla en el maestro si este (02) muere. Bueno, mucho por ese plan. Estamos bastante seguros de que este es un problema del sistema operativo.
Van
Estoy seguro de que esto no funcionó para el póster original, pero para mí esto sucedió después de una actualización de seguridad, y reiniciar mysql fue suficiente.
Kzqai

Respuestas:

19

SO: implementaciones de Ubuntu (Debian)

Opción de servidor MySQL: open-files-limit

Parece que el upstart de Debian no usa los parámetros definidos en /etc/security/limits.conf , por lo que cuando ejecuta mysql a través del comando de servicio (y, por lo tanto, en el arranque), anula esos límites definidos y usa el valor predeterminado 1024 .

La solución es modificar el archivo mysql.conf que define el servicio de inicio , se encuentra en /etc/init/mysql.conf y agrega las siguientes líneas antes del bloque previo al inicio :

# 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

Referencias

camioneta
fuente
Decepcionante esto no está documentado claramente en alguna parte. :( Acabamos de encontrarnos con la publicación de David en el servidor por defecto.
Van
Y esto no es un error, de acuerdo con esto: bugs.launchpad.net/mysql-server/+bug/938669
Van
Esto puede volverse repentina y alarmantemente evidente después de agregar particiones a las tablas, lo que puede causar un aumento en los archivos abiertos.
markdwhite
Esto funcionó para mí en Ubuntu 15.10. Después de actualizar los paquetes recibí toneladas de mensajes de error de "No se puede abrir el archivo", que rompieron todos mis sitios: (... Un millón de gracias por ahorrarme mucho dolor de cabeza y tiempo.
Emmanuel
¿Alguien puede explicar qué es el bloque "pre-inicio"? Estoy ejecutando Ubuntu 16 y tengo este problema, pero el archivo de configuración se ve diferente de lo que era anteriormente
billynoah
4

Tuve el mismo problema en Ubuntu 15.10.

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758 - trajo la solución:

  1. compruebe si /lib/systemd/system/mysql.service o /lib/systemd/system/mysqld.service existe
  2. (en mi caso) si no, cree /lib/systemd/system/mysql.service y copie el contenido de este archivo https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/ comentarios / 11 y agregue las dos líneas en algún lugar del archivo

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. si existe uno o ambos archivos, verifique si se incluyen estas dos líneas:

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

... y todo debería estar bien.

Hendrik Eggers
fuente
1

Como ninguno de los anteriores solucionó el problema para mí (solo hace que el sistema se quede sin memoria), aquí está la solución que encontré:

En /etc/mysql/my.confnecesita aumentar MySQL internos open_files_limit. Agregue temporalmente esto a la configuración y reinicie MySQL.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

Después de ejecutar la operación que le da el error de demasiados archivos abiertos , puede cambiar su configuración a sus valores predeterminados y reiniciar MySQL nuevamente.

mniess
fuente
esto funcionó para mí en Ubuntu 16.04, gracias :)
Richard Frank
0

Gracias por la solución. Pero para mí, el asunto ha sido eclipsado por los otros dos hechos.

  1. Mi directorio de datos es diferente de la instalación predeterminada. Por múltiples razones, tanto históricas como técnicas.
  2. Estaba actualizando desde una instalación muy antigua, que pasó por varios puertos hacia atrás y hacia adelante. En el primer inicio de un MySQL 5.5 recién instalado, el motor InnoDB no se activó (la implementación interna estaba deshabilitada en el archivo de configuración, pero el complemento que estaba disponible en versiones anteriores no está presente en 5.5), y la marca de actualización se creó sin actualizar realmente cualquier mesa

Después de solucionar el problema de InnoDB, todavía escupía

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

Tuve que iniciar mysqld en la consola raíz y reiniciar manualmente

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

Luego, el servidor comenzó a mostrar bases de datos, pero no pudo acceder a algunas de las tablas. Su solución con mayores límites solucionó el resto de los problemas, ¡gracias!

AnrDaemon
fuente