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?

¿Fue útil?

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 de mysql_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 max_connection está establecido en 200, continuarás sufriendo ...


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:

  1. ajuste la base de datos según MySQLTuner .
  2. 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: -

enlace del artículo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top