MySQL erro “Excesso de conexões”
-
05-07-2019 - |
Pergunta
Estou usando o MySQL 5.0 para um site que é hospedado pelo GoDaddy (linux).
Eu estava fazendo alguns testes no meu aplicativo web, e de repente percebi que as páginas foram refrescante muito devagar. Finalmente, depois de uma longa espera, eu comecei a uma página que disse algo ao longo das linhas de "Erro MySQL, Muitas conexões ...", e apontou para o meu arquivo config.php que se conecta ao banco de dados.
Tem sido apenas me conectar ao banco de dados, nenhum outro usuário. Em cada uma das minhas páginas, eu incluir o arquivo config.php no topo, e fechar a conexão mysql no final da página. Pode haver várias consultas entre os dois. Temo que eu não estou fechando conexões mysql suficiente (mysql_close ()).
No entanto, quando tento fechá-los depois de executar uma consulta, recebo erros de conexão na página. Minhas páginas são PHP e HTML. Quando eu tentar fechar uma consulta, parece que o próximo não vai ligar. Eu teria que incluir config.php novamente após o encerramento, a fim de conectar?
Este erro me assustou, porque em 2 semanas, cerca de 84 pessoas começam a usar esta aplicação web.
Graças.
EDIT:
Aqui estão algumas pseudo-código da minha 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(); ?>
Eu percebi que desta forma, cada vez que a página for aberta, a conexão é aberta, e depois fecha a conexão quando a página é feito o carregamento. Em seguida, a ligação abre novamente quando alguém clica em um botão na página, e assim por diante ...
EDIT:
Ok, então eu só tenho desligar o telefone com GoDaddy. Aparentemente, com o meu pacote Economia, eu estou limitado a 50 conexões simultâneas. Enquanto o meu problema hoje aconteceu com apenas me acessar o site, eles disseram que estavam tendo alguns problemas com o servidor anteriormente. No entanto, vendo como eu vou ter 84 usuários para meu aplicativo web, eu provavelmente deve atualizar para o "Deluxe", que permite a 100 conexões simultâneas. Em um determinado dia, pode haver cerca de 30 usuários que acessam o meu site em um tempo, então eu acho que o 100 seria uma aposta mais segura. Vocês concordam?
Solução
Shared-provedores de hospedagem geralmente permitem uma muito pequena quantidade de conexões simultâneas para o mesmo usuário.
O seu código faz é:
- abrir uma conexão com o servidor MySQL
- fazê-lo de coisas (gerando página)
- fechar a ligação no final da página.
A última etapa, quando feito no final da página não é obrigatório : (citando mysql_close
's manual):
Usando mysql_close () não é normalmente necessário, aberto como não-persistentes links são automaticamente fechadas ao final da execução do script.
Mas note que você provavelmente não deveria usar conexões persistentes de qualquer maneira ...
Duas dicas:
- uso
mysql_connect
insead demysql_pconnect
(já OK para você) - Definir o quarto parâmetro de mysql_connect como false (já OK para você, como é o valor padrão) : (citando o manual):
Se uma segunda chamada é feita para mysql_connect () com a mesma argumentos, nenhuma nova ligação será estabelecida, mas em vez disso, o link identificador do link já abriu será retornado.
O new_link modifica parâmetros esse comportamento e faz mysql_connect () sempre aberta a nova ligação, mesmo se mysql_connect () foi chamado antes com a mesma parâmetros.
O que poderia causar o problema, então?
Talvez você está tentando acessar várias páginas em paralelo (usando múltiplas abas em seu browser, por exemplo) , que irá simular vários usuários usando o site ao mesmo tempo?
Se você tem muitos usuários que utilizam o site ao mesmo tempo e o código entre mysql_connect
eo fechamento da conexão leva muito tempo, isso significará muitas conexões que está sendo aberto ao mesmo tempo ... E você vai chegar o limite de : - (
Ainda assim, como você é o único usuário do aplicativo, considerando que você tem até 200 conexões simultâneas permitidas, há algo estranho acontecendo ...
Bem, pensando em " muitas conexões " e "max_connections
" ...
Se bem me lembro, max_connections
não limita o número de conexões você pode abrir para o MySQL Server, mas o número total de conexões que podem bo aberta para que servidor, por qualquer pessoa se conectar a ele .
Citando a documentação do MySQL em muitas conexões :
Se você receber uma muitas conexões de erro ao tentar se conectar ao servidor mysqld, isso significa que todos ligações disponíveis estão a ser utilizados por outros clientes.
O número de conexões permitido é controlada pelos max_connections variável sistema. Seu valor padrão é 100. Se você precisa para suportar mais conexões, você deve definir um maior valor para essa variável.
Então, na verdade, o problema pode não vir de você nem seu código (o que parece bem, na verdade) : ele pode "apenas" ser que você não é o único a tentar ligar a essa servidor MySQL (lembre-se, "hospedagem compartilhada") , e que há muitas pessoas a usá-lo ao mesmo tempo ...
... E se eu estou certo e é esse , não há nada que você pode fazer para resolver o problema: enquanto há muitas bases de dados / usuários no servidor e que max_connection
é conjunto de 200, você vai continuar sofrendo ...
Como nota: antes de voltar para GoDaddy pedindo-lhes sobre isso, seria bom se alguém poderia validar o que eu disse ^^
Outras dicas
Eu tinha cerca de 18 meses de lidar com isso ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections- erro / )
As soluções que eu tinha (que se aplica a você) no final foram:
- ajustar o banco de dados de acordo com a MySQLTuner .
- desfragmentar as tabelas com base semanal sobre este pós
A desfragmentação script bash do post:
#!/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
Certifique-se de não usar conexões persistentes. Isso geralmente é uma má idéia ..
Se você tem que .. No máximo você vai precisar para apoiar tanto as conexões que você tem apache processos. Você é capaz de alterar as max_connections definição?
Você está completamente certo de que o servidor de banco de dados é completamente dedicado a você?
Inicie a sessão no datbase como root e use "SHOW PROCESSLIST" para ver quem está conectado. Idealmente ligar este em seu sistema de monitoramento para ver quantas conexões existem ao longo do tempo e alerta se houver demasiados.
As conexões de banco de dados máxima pode ser configurado em my.cnf, mas cuidado com a falta de memória ou espaço de endereço.
Se você tiver acesso shell, use netstat para ver quantos soquetes são abertas para o seu banco de dados e de onde eles vêm.
No Linux, digite:
netstat -n -a |grep 3306
No Windows, digite:
netstat -n -a |findstr 3306
A solução poderia um desses, me deparei com este em um teste MCQA, mesmo eu não compreendeu qual é o certo!
Definir isso em my.cnf "set-variable = max_connections = 200"
Execute o comando "GLOBALmax_connections SET = 200"
Use sempre mysql_connect () função, a fim de se conectar ao servidor mysql
Use sempre mysql_pconnect () função, a fim de se conectar ao servidor mysql
A seguir são possíveis soluções:
1) Aumentar a configuração de conexão máximo, definindo a variável global no mysql.
set global max_connection=200;
Nota:. Ele irá aumentar a carga do servidor
2) Esvazie a sua pool de conexão como abaixo:
FLUSH HOSTS;
3) verificar o seu processlist PROCESSLIST e específico matar se você não quer nenhum deles.
Você pode referir-se o seguinte: -