Php

Php Erro max_user_connections – Resolvendo o problema de várias conexões abertas

Resolver o problema de max_user_connections normalmente é uma tarefa extremamente complicada.

Porque esse problema ocorre?

Normalmente os servidores oferecem um limite de conexões simultâneas. Algumas pessoas pensam que esse erro é gerado pelo excesso de conexões abertas e não fechadas.

Segundo a documentação php, link, “A conexão com o servidor será fechada assim que a execução do script terminar, a menos que tenha sido fechada anteriormente usando-se explicitamente mysql_close().”

Então? O que ocorre é que o mysql processa apenas uma query por vez, se por ventura uma não responder ele trava e as consultas posteriores vão ficando acumuladas até chegar ao limite de conexões.

Comando mysql para identificar os processos

Para conhecer quais as querys que estão sendo executadas no servidor mysql é possível executar o comando SHOW FULL PROCESSLIST. Para que serve? Ele irá retornar todas as querys que estão sendo executadas no servidor mysql.

É comum quando se depara pela primeira vez com este comando se perguntar onde será executado. Não se preocupe, ele é um comando sql semelhante a “select * from …”. Então pode ser executado dentro do Mysql Workbench, ou do Phpmyadmin, ou mesmo via php direto.

Caso esteja estudando sobre o assunto poderá identificar: SHOW PROCESSLIST e SHOW FULL PROCESSLIST. A diferença entre os dois comandos é que o segundo retorna a query sql completa enquanto o primeiro retorna apenas o inicio da query.

Uma coisa importante a saber é que caso você tenha atingido o limite de max_user_connections é provável que não conseguirá executar este comando. Pois o servidor vai bloquear novas conexões. Nesse momento você terá que entrar em contato com o servidor e solicitar: 1) reiniciar o serviço mysql de seu site. Dificilmente em uma hospedagem compartilhada isso será possível, então 2) peça que seja executado KILL nos processos atuais.

Acima mostro um exemplo do comando PROCESS LIST. O Id é o número que identifica o processo no servidor, Time é o tempo que está query está sendo processada e Info é o comando executado. Neste caso a única query a ser processada no servidor é o próprio comando. Use esse comando várias vezes seguias para identificar querys nocivas ao sistema.

O comando KILL

KILL é o comando usado para matar os processos abertos. Usando o comando PROCESSLIST várias vezes seguidas é possível identificar o time de uma query crescendo, principalmente se o servidor não enviar uma resposta.

Nesse caso use o comando KILL IdDoProcesso. Por exemplo para matar o processo da imagem:

KILL 103634625

Descobrir o número de conexões permitidas

Use o comando a seguir.

SHOW VARIABLES WHERE Variable_name = "max_user_connections"

Atitudes de curto prazo

O que vou ensinar aqui é um pecado mortal, mas sei que o max_user_connections normalmente ocorre quando o site já está em produção. Então é necessária uma atitude para remediar o problema.

Em teoria: Toda vez que formos abrir uma conexão iremos verificar se a quantidade de processos em execução for maior que 10. Caso afirmativo será executado kill em todos os processos abertos.

Então adapte ao seu código, no qual, Conecta() é a função que você gera a conexão e adicione a função FechaConexoes():

<?php
function Conecta(){
    $conexao = mysql_connect ("mysql03.host.com.br", "user", "pass");
    mysql_select_db("alugueldetempo4",$conexao); 
    FechaConexoes();
}
function FechaConexoes() {
    //DELETA TODAS AS CONEXÕES ABERTAS
    $result = mysql_query("SHOW FULL PROCESSLIST");
    $conexoesAbertas = mysql_num_rows($result);
    if ($conexoesAbertas > 10) {
        while ($row=mysql_fetch_array($result)) {
        $process_id=$row["Id"];
            if ($row["Time"] > 200 ) {
                $sql="KILL $process_id";
                mysql_query($sql);
            }
        }
    }
}

É provável que o código necessite de adaptação, quem quiser comentar abaixo com sua solução ajudará a outras pessoas.

Resolvendo o problema

Após remediar é necessário resolver. Você deve monitorar através do process list as querys que estão sendo executadas. Em especial as que possuem tempo de resposta maior.

Se estiver usando um cloud ou servidor dedicado, pode Ativar o log de slow-queries.

Também pode ser adaptada a função acima para enviar por e-mail ou gravar em log o campo info (que é o comando sql) quando executar o Kill.

Anúncios
Padrão

6 comentários sobre “Php Erro max_user_connections – Resolvendo o problema de várias conexões abertas

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s