¿Qué causa la advertencia "max_user_connections" en el frontend de WordPress?
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.

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.

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

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

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:
- Conectarse a la base de datos
- 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.

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.

¿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.

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 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.

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)

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.
