Cómo resolver demasiadas conexiones y errores fatales en mysql ejecutándose en vps

9

Estoy ejecutando una aplicación PHPlist en mi servidor linode, ejecutando simultáneamente 12 scripts PHP, cada uno de los cuales abre una conexión MySQL. Ahora, cuando accedo a PHPlist, a menudo muestra este error:

Error grave: Lo sentimos, el servidor está actualmente muy ocupado, intente nuevamente más tarde.

Cuando intento acceder a phpMyAdmin, me muestra un error # 1040. La salida de mis scripts PHP que se ejecutan a través de crontrabajos muestra:

Advertencia de PHP: mysqli_connect (): (HY000 / 1040): demasiadas conexiones

Estoy usando la pila LAMP en el servidor con phpMyAdmin; la topsalida en la terminal muestra el mysqlduso de 100-130% de CPU. Cuando intento solucionar este problema, recibo algunas pistas:

  • Aumentar la variable max_connection: estoy usando 200 (100 por defecto)
  • Abrir caché de tabla: 512 (400 por defecto)

Hay muchas variables para configurar, pero no puedo determinar cuáles son específicas, obtengo algunas referencias de: demasiadas conexiones y http://dev.mysql.com/doc/refman/5.5/en/table-cache. html

Pero según mi uso, cómo aumentar la memoria y cuál es la memoria máxima difícil para mí.

En mi servidor estoy usando alrededor de 12 scripts PHP, una aplicación PHPlist para enviar correos electrónicos y una importante base de datos para registros de usuarios.

Amablemente ayúdame a resolver este problema.

Shashank
fuente

Respuestas:

12

Lo primero que debes hacer es ejecutar esta consulta:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

Esto mostrará una lista de todos los usuarios que tienen el privilegio SUPER . La mayoría de los usuarios que realizan procesamiento de DB relacionado con la aplicación no requieren este privilegio. De acuerdo con la documentación de MySQL , las personas con privilegios SUPER pueden hacer lo siguiente:

  • Ejecute CHANGE MASTER TO para controlar las coordenadas de replicación
  • MATAR o mysqladmin killmatar hilos pertenecientes a otras cuentas
  • PURGAR REGISTROS BINARIOS para eliminar sistemáticamente registros binarios
  • Realizar cambios de configuración usando SET GLOBAL para modificar las variables globales del sistema
  • comando de depuración de mysqladmin
  • habilitar o deshabilitar el registro
  • realizar actualizaciones incluso si la variable del sistema * read_only * está habilitada
  • iniciar y detener la replicación en servidores esclavos
  • especificación de cualquier cuenta en el atributo DEFINER de programas almacenados y vistas
  • AQUÍ ES EL MÁS IMPORTANTE PARA SU PROBLEMA:: Le permite conectarse (una vez) incluso si se alcanza el límite de conexión controlado por la variable del sistema max_connections .

Deberá iniciar sesión como root @ localhost y revocar el privilegio SUPER de la siguiente manera:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

Una vez que haga esto, siempre que todos los usuarios inunden las conexiones mysql, solo root@localhostpueden iniciar sesión. Después de todo, si todos y su abuela tuvieran el privilegio SUPER, esto impediría root@localhostconectarse antes que todos los demás. Si max_ connections está en 200 y necesita elevarlo a 300 sin tener que reiniciar mysqld, puede aumentar dinámicamente max_ connections con este comando:

mysql> SET GLOBAL max_connections = 300;

Eso permitirá que haya más conexiones efectivas de inmediato, pero no solo aumente arbitrariamente el número por capricho. Debe asegurarse de que mysql tenga suficiente RAM para acomodar el aumento.

PRECAUCIÓN: si cambia max_ connections dinámicamente a 300, colóquelo en /etc/my.cnf

[mysqld]
max_connections=300

Puede ejecutar mysqltuner.pl en su servidor de base de datos MySQL. Si no lo tiene, ejecute lo siguiente:

cd
wget mysqltuner.pl
perl mysqltuner.pl

La tercera línea debajo de Performance Metrics tiene esto

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

Ver los 5.4M por hilo? Eso se multiplica por max_ connections. En este ejemplo, eso sería un máximo de aproximadamente 10.8G de RAM. Por lo tanto, cada vez que aumente max_ connections, debe ejecutar mysqltuner.pl y verificar si está presionando el sistema operativo para obtener demasiada memoria.

En cualquier caso, limitar quién tiene privilegios SUPER le da a dichos usuarios la oportunidad de mitigar la inundación mysqld con DB Connections.

RolandoMySQLDBA
fuente
aparece este error al intentar perl mysqltuner.pl "Intenté usar las credenciales de inicio de sesión de la cuenta de mantenimiento de Debian, pero fallaron".
Shashank
Estoy intentando esto en mi servidor ubuntu local, muestra el uso máximo de memoria, pero en mi vps, muestra un error y no puedo iniciar sesión en phpmyadmin pero inicio sesión con éxito en el terminal mysql
Shashank
Este cmd wget mysqltuner.pldescargó index.html, pero era un archivo perl, así que lo renombré a mysqltuner.pl y el siguiente cmd perl mysqltuner.plfuncionó.
MotsManish
2
  1. La variable global max_connectionsdetermina el número máximo de conexiones simultáneas a MySQL. Asegúrese de tener un valor alto para esta variable. Puede aumentar este valor a 300 o 400 e intente reiniciar MySQL después de esta configuración.
  2. Diseñe su aplicación de modo que una conexión MySQL se mantenga abierta durante un período de tiempo muy corto.
  3. También debe verificar que el código del cliente no esté usando conexiones persistentes (como mysql_pconnect ()) de manera incorrecta.

También ejecute el Flush status;comando en el servidor MySQl para reducir este valor.

Espero que estas sugerencias ayuden.

Mahesh Patil
fuente
0

Compruebe si su disco está lleno, esto puede causar el mismo error:

df -h

le mostrará el espacio restante en cada partición, probablemente tenga que verificar la partición raíz /(o / var / en caso de que tenga una partición adicional para esto):

df -h /
rubo77
fuente