Error de MySQL "Demasiadas conexiones"
-
05-07-2019 - |
Pregunta
Estoy usando MySQL 5.0 para un sitio alojado por GoDaddy (linux).
Estaba haciendo algunas pruebas en mi aplicación web, y de repente me di cuenta de que las páginas se actualizaban muy lentamente. Finalmente, después de una larga espera, llegué a una página que decía algo como "Error de MySQL, demasiadas conexiones ...", y señaló mi archivo config.php que se conecta a la base de datos.
Me acaba de conectar a la base de datos, no a otros usuarios. En cada una de mis páginas, incluyo el archivo config.php en la parte superior y cierro la conexión mysql al final de la página. Puede haber varias consultas en el medio. Me temo que no estoy cerrando las conexiones mysql lo suficiente (mysql_close ()).
Sin embargo, cuando intento cerrarlos después de ejecutar una consulta, recibo errores de conexión en la página. Mis páginas son PHP y HTML. Cuando intento cerrar una consulta, parece que la siguiente no se conectará. ¿Tendré que incluir config.php nuevamente después del cierre para poder conectarme?
Este error me asustó porque en 2 semanas, alrededor de 84 personas comenzaron a usar esta aplicación web.
Gracias.
EDITAR:
Aquí hay un pseudocódigo de mi página:
require_once('../scripts/config.php');
<?php
mysql_query..
if(this button is pressed){
mysql_query...
}
if(this button is pressed){
mysql_query...
}
if(this button is pressed){
mysql_query...
}
?>
some html..
..
..
..
..
<?php
another mysql_query...
?>
some more html..
..
..
<?php mysql_close(); ?>
Pensé que de esta manera, cada vez que se abre la página, se abre la conexión, y luego la conexión se cierra cuando la página termina de cargarse. Luego, la conexión se abre de nuevo cuando alguien hace clic en un botón de la página, y así sucesivamente ...
EDITAR:
Bien, así que acabo de hablar por teléfono con GoDaddy. Aparentemente, con mi Paquete Económico, estoy limitado a 50 conexiones a la vez. Si bien mi problema de hoy ocurrió solo con mi acceso al sitio, dijeron que tenían problemas con el servidor anteriormente. Sin embargo, dado que voy a tener 84 usuarios para mi aplicación web, probablemente debería actualizarme a "Deluxe", que permite 100 conexiones a la vez. En un día determinado, puede haber alrededor de 30 usuarios accediendo a mi sitio a la vez, por lo que creo que el 100 sería una apuesta más segura. ¿Están de acuerdo?
Solución
Los proveedores de alojamiento compartido generalmente permiten una cantidad bastante pequeña de conexiones simultáneas para el mismo usuario.
Lo que hace su código es:
- abrir una conexión con el servidor MySQL
- hacer sus cosas (generar la página)
- cierra la conexión al final de la página.
El último paso, cuando se hace al final de la página, no es obligatorio : (citando < code> mysql_close 's manual):
Usando mysql_close () no es usualmente necesario, como abierto no persistente los enlaces se cierran automáticamente en el fin de la ejecución del script.
Pero tenga en cuenta que probablemente no debería usar conexiones persistentes de todos modos ...
Dos consejos:
- use
mysql_connect
en lugar demysql_pconnect
(ya está bien para usted) - Establezca el cuarto parámetro de mysql_connect en falso (ya está bien para usted, ya que es el valor predeterminado) : (citando el manual):
Si se realiza una segunda llamada a mysql_connect () con el mismo argumentos, no habrá nuevo enlace establecido, pero en cambio, el enlace identificador del enlace ya abierto Será devuelto.
El nuevo_enlace El parámetro modifica este comportamiento y hace que mysql_connect () siempre abra un nuevo enlace, incluso si mysql_connect () era Llamado antes con el mismo. parámetros.
¿Qué podría causar el problema, entonces?
¿Quizás está intentando acceder a varias páginas en paralelo (usando varias pestañas en su navegador, por ejemplo) , que simularán a varios usuarios que usan el sitio web al mismo tiempo?
Si tiene muchos usuarios que usan el sitio al mismo tiempo y el código entre mysql_connect
y el cierre de la conexión lleva mucho tiempo, esto significará que muchas conexiones se abrirán al mismo tiempo. .. Y alcanzarás el límite :-(
Aún así, como usted es el único usuario de la aplicación, considerando que tiene hasta 200 conexiones simultáneas permitidas, hay algo extraño ...
Bueno, pensando en " demasiadas conexiones " y " max_connections
" ...
Si recuerdo correctamente, max_connections
no limita el número de conexiones que usted puede abrir al servidor MySQL, pero el número total de conexiones que puede abrirse en ese servidor, por cualquiera que se conecte a él .
Citando la documentación de MySQL en Demasiadas conexiones :
Si tienes demasiadas conexiones error cuando intenta conectarse a la servidor mysqld, esto significa que todos las conexiones disponibles están en uso por otros clientes.
El número de conexiones permitidas es controlado por max_connections variable del sistema. Su valor predeterminado es 100. Si necesita admitir más conexiones, debe establecer una valor para esta variable.
Entonces, en realidad, el problema podría no venir de usted ni de su código (que se ve bien, en realidad) : podría " simplemente " ya que no es el único que intenta conectarse a ese servidor MySQL (recuerde, " alojamiento compartido ") , y que hay demasiadas personas que lo usan al mismo tiempo ...
... Y si tengo razón y es que , no hay nada que puedas hacer para resolver el problema: siempre que haya demasiadas bases de datos / usuarios en ese servidor y ese
Como una nota al margen: antes de volver a GoDaddy preguntándoles sobre eso, sería bueno si alguien pudiera validar lo que acabo de decir ^^
Otros consejos
Tuve unos 18 meses de lidiar con esto ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections- error / )
Las soluciones que tenía (que se aplicarían a ti) al final fueron:
- ajuste la base de datos según MySQLTuner .
- desfragmente las tablas semanalmente en función de esta publicación
Desfragmentar script de bash desde la publicación:
#!/bin/bash
# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"
for fragment in $FRAGMENTED_TABLES; do
database="$( echo $fragment | cut -d. -f1 )"
table="$( echo $fragment | cut -d. -f2 )"
[ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
OPTIMIZE TABLE $table;" > /dev/null 2>&1
done
Asegúrate de no estar usando conexiones persistentes. Esto suele ser una mala idea ...
Si tienes eso ... A lo sumo, tendrás que admitir tantas conexiones como procesos de apache. ¿Puedes cambiar la configuración de max_connections?
¿Está completamente seguro de que el servidor de bases de datos está completamente dedicado a usted?
Inicie sesión en la base de datos como root y use " SHOW PROCESSLIST " para ver quién está conectado. Lo ideal sería conectar esto a su sistema de monitoreo para ver cuántas conexiones hay en el tiempo y avisar si hay demasiadas.
Las conexiones máximas de la base de datos se pueden configurar en my.cnf, pero tenga cuidado con la falta de memoria o espacio de direcciones.
Si tiene acceso de shell, use netstat para ver cuántos sockets están abiertos en su base de datos y de dónde provienen.
En Linux, escriba:
netstat -n -a |grep 3306
En Windows, escriba:
netstat -n -a |findstr 3306
La solución podría ser una de estas, me encontré con esto en una prueba de MCQA, ¡incluso no entendí cuál es la correcta!
Establezca esto en my.cnf " set-variable = max_connections = 200 "
Ejecuta el comando " SET GLOBALmax_connections = 200 "
Utilice siempre la función mysql_connect () para conectarse al servidor mysql
Utilice siempre la función mysql_pconnect () para conectarse al servidor mysql
Los siguientes son posibles soluciones:
1) Aumente la configuración de conexión máxima estableciendo la variable global en mysql.
set global max_connection=200;
Nota: aumentará la carga del servidor.
2) Vacíe su grupo de conexiones de la siguiente manera:
MANGUERAS DE LAVADO;
3) verifique su lista de procesos y elimine la lista de procesos específica si no desea ninguno de ellos.
Puede referir esto: -