Error MySQL 8 Can’t connect to local MySQL server through socket or Cannot allocate memory for the buffer pool

Translate this web site to English, in this link from google translate

Síntomas

El MySQL empezó a fallar, cuando ingresaba por phpMyAdmin web me botava, porque se caía el servicio de MySQL en el servidor Linux, en este caso era un Centos 8. Uno de los errores por web era el siguiente:

Esta caída también puede ser confundida con deshabilitar el firewall, luego reiniciar el MySQL y viendo que funciona, podría hacernos pensar que es el firewall, pero en realidad no es así, es pura coincidencia porque si empezamos a manipular el phpMyAdmin, se volverá a caer. La siguiente imagen también es una más relacionada al error:

Luego de recibir el error por phpMyAdmin, cuando intentamos entrar al mysql por la consola del servidor, nos da el error “can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (111)”. Por otro lado, si entramos al log de errores, nos da el supuesto error “16397 no process is using /var/lib/mysql/mysql.sock, which means it is a garbage – No process is using /var/lib/mysql/mysql.sock, which means it is a garbage, so it will be removed automatically”. Por lo tanto al no poder entrar a MySQL por consola Linux, reiniciamos el MySQL, nos conectamos, pero se vuelven a repetir todos los errores desde phpMyAdmin hasta aquí y así sucesivamente se hace un proceso repetitivo (loop), aquí la imagen del error por consola al querer entrar a MySQL:

Si vemos por el «systemctl» los procesos que han fallado, nos mostrará una tabla donde muestra que MySQL ha fallado, con el comando «systemctl –failed» siguiente:

[root@apps-demos-centos-s-1vcpu-1gb-nyc1-01 app-pedidos-curso-laravel5]# systemctl –failed

UNIT LOAD ACTIVE SUB DESCRIPTION
● mysqld.service loaded failed failed MySQL 8.0 database server

Si entramos al log de errores del mysql, que esta en la siguiente ruta:

Vemos el siguiente log donde nos indica al parecer 2 errores, el primero «Cannot allocate memory for the buffer pool» y el segundo que nos dice que se ha recuperado de una caída «Starting crash recovery» y «Crash recovery finished», la imagen sería la siguiente:

Ya después de muchos intentos de volver a iniciar sesión en MySQL por consola y de ejecutar el comando «systemctl restart mysqld» muchas veces, empezó a mostrar estos errores, que ya no eran nada buenos:

Para poder volver acceder a MySQL, Tuvimos que reiniciar el servidor con el comando
shutdown -r now

Una vez iniciado el servidor y todo estaba funcionando correctamente, lo primero es NO entrar por web al phpMyAdmin, sino, volverían a suceder los errores. Luego de investigar en internet durante mucho tiempo, me topé con una página donde explicaba sobre el primer mensaje de error dentro del log «Cannot allocate memory for the buffer pool». Decía que la solución no es más espacio, el problema era Apache web server no MySQL, tenemos que reducir la memoria del parámetro «innodb-buffer-pool-size». La página que me ayudó fue la famosa «StackOverFlow» y en enlace directo es el siguiente «clic aquí»

Lo que dice es lo siguiente: Este buffer es usado por el proceso de MySQL desde el inicio, entonces cuando Apache necesita más recursos, el kernel limpiará la RAM de los servicios, esto significa detener MySQL en lugar de bloquear el servidor (y es ahí donde se cae el MySQL).

Solución

Primero veremos la memoria usada y la memoria libre del servidor, vemos que hay 56 Megas libres, esto lo hacemos con el comando:
free -h

También con este comando podemos ver la memoria usada y la memoria libre del servidor, vemos que subió a 59 Megas libres:
vmstat -s -S M

Si tenemos 59 Megas libres, el parámetro «innodb_buffer_pool_size» de MySQL no debe sobrepasar este valor, debe ser inferior, vamos a verificar entrando a mysql y ejecutando el siguiente comando (si MySQL sigue con problemas y no puedes entrar, reiniciar todo el servidor con el comando shutdown –r now):
mysql –u root –p
mysql> show variables like ‘innodb_buffer_pool%’;

Vemos que la tabla nos muestra que el parámetro “innodb_buffer_pool_size” tiene 134217728 (esto está en bytes), como tiene 9 dígitos son Megas, por lo tanto si lo dividimos 2 veces entre 1024 nos da los megas en un número más legible que es 128 Megas. Y este valor es demasiado y sobre pasa nuestra memoria libre que es de 56 Megas, le asignaremos 16 Megas.
Un query para podernos ayudar a configurar un tamaño para “innodb_buffer_pool_size” es el siguiente, esto nos mostrará el RIBPS, Tamaño recomendado de InnoDB Buffer Pool, basado en todos los Datos e Índices de InnoDB, con un 60% adicional. Pero solo es una recomendación, a mí me mostraba 1Giga y no podía darle un Giga basado en la memoria libre de mi servidor. Este se ejecuta dentro de MySQL:
SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine=’InnoDB’) A;

En Centos 8 el archivo de configuración para MySQL 8 se llama «mysql-server.cnf» y está en la ruta «/etc/my.cnf.d»

Vamos a configurar el archivo “mysql-server.cnf” para disminuirle la memoria a 16 Megas, pero antes le sacaremos un backup, entramos a la ruta “/etc/my.cnf.d”:
cd /etc/my.cnf.d
cp mysql-server.cnf mysql-server-backup.cnf

El contenido del archivo, originalmente era el siguiente:

Ahora editamos el archivo «mysql-server.cnf» para asignarle 16 Megas con el comando vi:
vi mysql-server.cnf

Presionamos la tecla [a] para comenzar a editar el archivo.

Le adicionamos unas líneas que son las siguientes:

#
# Fine Tuning
#
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options = BACKUP
#max_connections = 100
innodb_buffer_pool_size=16M

Finalmente para guardar el archivo con los cambios, presionamos la tecla [ESC], luego escribimos:
:wq [ENTER]

El archivo con nuestros cambios, al finalizar, se deberá de ver así:

Reiniciamos el servicio mysql con el comando:
systemctl restart mysqld

Ahora volvemos a verificar la tabla de parámetros del MySQL, entrando al MySQL y ejecutando el siguiente comando:
mysql –u root –p
mysql> show variables like ‘innodb_buffer_pool%’;

Ahora muestra 16777216, como tiene 8 dígitos también lo dividimos 2 veces entre 1024 porque está en Bytes y lo pasaremos a Megas, esto nos da 16 Megas, ahora sí cumple con estar por debajo de la memoria libre del servidor.

Para asegurarnos que todo ande bien reiniciamos el servidor con el comando:

Shutdown –r now

Listo, los cambios funcionaron y ya puedo entrar y trabajar en MySQL desde la web con phpMyAdmin 🙂

Deja una respuesta

Tu dirección de correo electrónico no será publicada.