¿Qué causa la advertencia "max_user_connections" en el frontend de WordPress?

19 abr 2016, 01:02:24
Vistas: 18.8K
Votos: 3

Actualmente estoy recibiendo este error solo en el front-end (no dentro de /wp-admin):

Warning: mysqli_real_connect(): (HY000/1203): User xxx ya tiene más de
'max_user_connections' conexiones activas en
/hermes/.../public_html/myhome/wp-includes/wp-db.php en la línea 1489

Warning: mysql_connect(): User xxx ya tiene más de
'max_user_connections' conexiones activas en
/hermes/.../public_html/myhome/wp-includes/wp-db.php en la línea 1515
Error al establecer conexión con la base de datos

Y me pregunto ¿cómo puede aparecer esto cuando soy el único visitante? Estoy usando WP 4.5.

Contacté al host quien amablemente respondió lo siguiente:

Actualmente tu sitio web muestra
'Error al establecer conexión con la base
de datos' porque el usuario de la
base de datos ha excedido el
límite de conexiones concurrentes para un
usuario de base de datos, que es 10. Esta
es la razón por la que el sitio muestra
error de base de datos. El script arroja el
error de conexión concurrente cuando
el número de conexiones a la base de datos
excede el límite establecido en el servidor. En
nuestra plataforma compartida, permitimos
un máximo de 10 conexiones
concurrentes a una base de datos, lo cual es
ideal en una plataforma compartida y no es
posible aumentar este límite.
El límite de consultas para tu sitio será
reiniciado en un par de horas, así que
deberías poder acceder a la
base de datos después de ese tiempo.

Hay dos casos en los que el script muestra
el error anterior: uno es cuando hay mucho
tráfico en el sitio y las conexiones concurrentes
a la base de datos alcanzan el límite, y el segundo
caso es cuando la conexión a la base de datos
no se cierra en el script, incluso con tráfico
moderado el script muestra el error de
conexiones concurrentes. Para solucionar este
problema, debes cerrar la conexión a la base de datos
inmediatamente después de obtener
el contenido requerido de la base de datos.
Para cerrar la conexión puedes usar
la función PHP mysql_close() con
el parámetro de conexión. Esto te ayudará
a usar el límite de conexiones a la base de datos
de manera más eficiente.

En otras palabras, todo está bien de su lado, es un error de WP.

7
Comentarios

Estás teniendo problemas de alojamiento. Esto no está directamente relacionado con WordPress. ¿Eres tú quien aloja este sitio web?

prosti prosti
19 abr 2016 02:00:01

Sí. Pero mi panel de administración funciona perfectamente. Por favor, revisa la respuesta del host arriba.

Ramnath Ramnath
19 abr 2016 02:18:07

@prosti No, esto no es un problema de alojamiento. El problema parece ser un tema o un plugin. 10 conexiones concurrentes son más que suficientes para la mayoría de los casos de uso en sitios más pequeños.

kaiser kaiser
19 abr 2016 02:52:54

@kaiser Extrañamente el problema a veces desaparece por completo. ¿Puedes decirme cómo solucionarlo sin complicaciones? Ya he perdido mucho tiempo. ¡Gracias!

Ramnath Ramnath
19 abr 2016 03:17:57

Sugeriría que instales el plugin debug bar y comiences a revisar las consultas. Podría ser fácilmente que algunas están tardando demasiado, produciendo así demasiadas consultas concurrentes.

kaiser kaiser
19 abr 2016 03:20:22

@kaiser Probé debug bar. Pero no ayudó ya que el problema ocurre cuando el sitio no se conecta. También descubrí que es un problema del tema. Cuando cambio al tema Twenty Fifteen, ¡todo funciona sin problemas! La pregunta es, ¿cómo puedo investigar y aplicar las correcciones apropiadas? Gracias.

Ramnath Ramnath
19 abr 2016 23:29:03

Actualiza tu pregunta con tus hallazgos. También intenta descubrir qué es exactamente lo que está ejecutando consultas en ese sitio que falla. Entonces podremos hablar más.

kaiser kaiser
19 abr 2016 23:33:35
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 3
3

No está relacionado con WordPress, así que no estoy seguro si tengo derecho a responder aquí, pero aún así incrementa max_user_connections en el archivo de configuración my.cnf de MySQL ya que solo estás haciendo pruebas.

Hay varias causas para quedarse sin conexiones, las más comunes involucran cuando el servidor Web/Aplicación está creando un número inesperadamente alto de conexiones debido a una mala configuración o algún script que está dejando conexiones abiertas o creando demasiadas conexiones por error.

La solución: Algunas personas aumentan max_connections a un número muy alto para que MySQL nunca se quede sin conexiones.

Sin embargo, esto puede causar problemas de utilización de recursos consumiendo memoria y hacer que el servidor MySQL haga swapping o sea terminado por el proceso OOM killer o tener un rendimiento muy pobre debido a alta contención.

19 abr 2016 02:05:20
Comentarios

Pero luego el host dice que es un error de WP. He incluido su respuesta en mi respuesta anterior. Por favor revisa.

Ramnath Ramnath
19 abr 2016 02:19:33

Puedes tener una invasión de mysql_connect() sin cerrarla. Mala práctica en WordPress por cierto. Piensa.

prosti prosti
19 abr 2016 02:23:01

Pero apenas actualicé mi WP a 4.5 recientemente. ¿Qué debo hacer ahora?

Ramnath Ramnath
19 abr 2016 02:38:02
4

Primero, debes habilitar los errores para $wpdb, la abstracción de base de datos de WordPress:

$GLOBALS['wpdb']->show_errors;

De lo contrario, ninguna de tus conexiones a la base de datos realmente fallará y se abortará con una instancia de \WP_Error. El código de error predeterminado es un 500.

El siguiente error proviene de \wpdb::db_connect():

Error al establecer una conexión a la base de datos

Hay dos casos en los que db_connect() entra en juego:

  1. Conectarse a la base de datos
  2. Verificar si hay una conexión a la base de datos

Solo el primero está permitido para fallar. Si la conexión falla mientras solo se realiza la verificación, no fallará y no mostrará este error. La conexión se realiza mediante \wpdb_driver::connect(), que proporciona la verificación de si la conexión está habilitada y disponible. Esto te indica que tu problema real es la conexión en sí. Puedes consultarlo (no es broma) en el siguiente archivo:

# interface-wp-db-driver.php
<?php
abstract class wpdb_driver {

Mejor no pienses en si hay alguna correlación entre la calidad general del código central de WP y la profunda comprensión de interfaces y clases abstractas aquí.

Justo antes de que la conexión a la base de datos se declare como "fallida" y se muestre el error, hay una línea interesante:

require_once WP_CONTENT_DIR . '/db-error.php';

Esto significa que se carga un Drop In antes de que todo die (muera). Puedes usar eso e iniciar un mecanismo de depuración allí. Tienes todo el núcleo de WP disponible ahí. Puedes comenzar a enviarte correos electrónicos, registrar esos errores en algún stack ELK/Kibana, Spark o lo que sea, algún SaaS o incluso a Slack (o simplemente a un archivo de texto). Registra tus errores allí, registra lo que está sucediendo, vuelca rutas, solicitudes, detalles de conexión a la base de datos, lo que creas que pueda ayudarte.

20 abr 2016 00:40:44
Comentarios

En realidad era un error del tema. Después de fallar todas las pruebas, le pedí al creador del tema que lo revisara y lo corrigió, reconociendo el error. Gracias.

Ramnath Ramnath
2 may 2016 18:11:17

¿Podrías agregar el error exacto y la solución (su corrección) como respuesta? Esto podría ayudar a otros usuarios que encuentren el mismo problema, de lo contrario tu pregunta permanecerá abierta para siempre. Gracias.

kaiser kaiser
2 may 2016 22:25:06

Me solicitaron que enviara los datos de acceso y después de eso no estoy seguro de lo que hizo exactamente el autor, pero sí puede que haya aplicado algunas correcciones. Todo lo que sé es que el tema fue actualizado. Así que sugeriría a otros que enfrenten problemas similares que actualicen el núcleo de WP y también el tema a las versiones más recientes. Gracias.

Ramnath Ramnath
2 may 2016 22:46:23

@Ramnath Lo siento, pero eso no es una solución. Tercerizaste el problema aquí, por favor dile al autor que responda aquí o pídele las correcciones. Querrás tener este entendimiento por si acaso necesitas reconstruir el sitio después de un hackeo o porque tu proveedor de hosting falló u otras circunstancias.

kaiser kaiser
3 may 2016 01:54:16
1

Los servidores web son multitarea... Asumiendo que tu tema no intente acceder directamente a la base de datos (no mediante la clase WPDB), cada conexión de usuario debería corresponder al tiempo de vida de procesamiento de una solicitud que WordPress maneja.

Asumiendo eso, probablemente tengas un manejo lento de cada solicitud, en combinación con varias solicitudes siendo manejadas "al mismo tiempo", lo cual puede ocurrir si tu tema está cargando contenido dinámicamente con AJAX.

(esto es básicamente lo que te indicó tu hosting, lo cual tiene sentido)

20 abr 2016 00:53:38
Comentarios

Una vez me pasó esto, y estaba convencido de que la compañía de hosting había cometido un error o que algún hacker había accedido al sitio. Resultó ser una consulta que tomaba aproximadamente 6 veces más tiempo por cada término añadido, lo que hacía que el tiempo requerido creciera rápidamente. Una vez que suficientes usuarios ejecutaban esta consulta, eso era todo. La operación no terminaba y sus conexiones a la base de datos no se cerraban. Consideraría si podrías tener algunos scripts similares y también instalar el plugin Query Monitor y navegar por el frontend y backend para identificar consultas lentas.

Joel M Joel M
15 feb 2018 08:58:26