[ERROR] /usr/sbin/mysqld: Can’t open file: ‘./databasename/tablename.frm’ (errno: 24)
MySQL deja de responder durante unos minutos y durante ese tiempo, los registros de mostrar mensajes como «Error in accept: Too many open files (Error en aceptar: Demasiados archivos abiertos)” and “Can’t open file (No se puede abrir el archivo)”:
160211 9:02:57 [ERROR] /usr/sbin/mysqld: Can't open file: './Centro_Psicologia/mdl_context.frm' (errno: 24)
160211 9:02:57 [ERROR] /usr/sbin/mysqld: Can't open file: './Centro_Psicologia/mdl_context.frm' (errno: 24)
160211 9:02:57 [ERROR] /usr/sbin/mysqld: Can't open file: './Centro_Psicologia/mdl_course.frm' (errno: 24)
El problema fue detectado después de la actualización a la versión de paquetes de Ubuntu/Debian (mysql-server).
Explicación:
El servidor MySQL se está quedando sin identificadores de archivo, ya que está golpeando el límite de identificador de archivo abierto por proceso. Si el servidor dispone de una gran cantidad de bases de datos y tablas (o si se utiliza la opción de servidor «innodb_file_per_table», o si necesita aumentar el tamaño de caché de la tabla), entonces esto puede aparecer. Cada tabla que se está accediendo al servidor utilizará un sistema de archivos para su uso.
Para ver el límite de los identificadores de archivo en el servidor actual, entrar a mysql server como root:
$mysql -u root -p*******
mysql> SHOW VARIABLES LIKE 'open_files_limit'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 1024 | +------------------+-------+ 1 row in set (0.00 sec)
mysql>
Se puede ver el número de archivos abiertos que el servidor está usando en ese momento, con:
mysql> SHOW GLOBAL STATUS LIKE 'Open_files'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_files | 296 | +---------------+-------+ 1 row in set (0.00 sec)
mysql>exit
Acerca de «upstart» y /etc/init/mysql.conf
Debian y Ubuntu utilizan un nuevo paquete de gestión de servicios defendido por Ubuntu como «Upstart«, configurado en /etc/ init/ (que no debe confundirse con /etc/init.d/). Los archivos en /etc/init son archivos de configuración que le dicen cómo y cuándo iniciar, detener, recargar la configuración, o consultar el estado de un servicio. En las nuevas versiones de Debian y Ubuntu, hay una transición de SysVinit a Upstart, por lo que muchos servicios vienen con guiones Sysvinit a pesar de que los archivos de configuración de Upstart son los preferidos. De hecho, las secuencias de comandos Sysvinit son procesadas por una capa de compatibilidad en Upstart.
Solución:
Agregue esto a la sección [mysqld] de su /etc/mysql/my.cnf:
$sudo nano /etc/mysql/my.cnf
# Buscar [mysqld] y colocar la linea:
open_files_limit = 65536
Reiniciar el servidor de MySQL:
# sudo service mysql restart
Verificar que aumentó el nuevo límite de archivos en el servidor:
$mysql -u root -pXXXXX
mysql> SHOW VARIABLES LIKE 'open_files_limit';
+ ------------------ + ------- +
| variable_name | valor |
+ ------------------ + ------- +
| open_files_limit | 65536 |
+ ------------------ + ------- +
1 row in set (0.00 sec)
mysql>
Referencias: