O erro «max_user_connections»: o que é, e por que não é um limite nosso

Bancos de Dados··· 955 visualizações· 6 min de leitura

O site para, ou para só uma página, e no registro de erros fica uma linha parecida com esta: User «conta_utilizador» has exceeded the «max_user_connections» resource. Lida à pressa, parece dizer que lhe pusemos um teto e que você bateu nele. Neste servidor, esse tecto não existe. Vale a pena perceber de onde vem mesmo a mensagem, porque a cura é outra.

Uma correção que lhe poupa meia hora de pesquisa. O motor destes servidores é o MariaDB 10.11.16, e não o MySQL Server. São parentes próximos, falam a mesma linguagem, e por compatibilidade até a linha de comandos continua a chamar-se mysql. Mas as mensagens de erro dizem quase sempre «MySQL», e quem as leva ao motor de busca acaba a ler páginas de outro produto, com valores por padrão diferentes dos daqui. Procure pelo nome do erro, e não pelo nome do produto.

O que este número é, quando existe

Cada vez que uma página do seu site fala com o banco de dados, abre um link, faz o que tem a fazer e fecha-o. Numa máquina compartilhada há duas contagens desses links, e confundem-se muito.

Configuração O que conta Neste servidor
max_connections As conexões abertas ao mesmo tempo no servidor inteiro, somando todo mundo que lá está. 151
max_user_connections As conexões abertas ao mesmo tempo por cada usuário de banco de dados. 0, ou seja, sem tecto definido

Atenção à leitura do zero: aqui zero quer dizer «sem limite», e não «zero ligações». É o valor que desliga a contagem. Entre todas as contas deste servidor, uma só tem um tecto próprio definido, posto para um caso concreto. Todas as outras não têm nenhum.

Por isso não vale a pena pedir-nos para subir o limite. O limite que a mensagem nomeia não está definido para a sua conta: não há número nenhum para subir. O que há é a causa verdadeira, e vem a seguir.

De onde vem, então, a mensagem

1 Do freio de consumo da conta. Estes servidores correm o MySQL Governor do CloudLinux, que mede quanto cada conta gasta em banco de dados e segura quem dispara, para que uma conta não pare a máquina de todo mundo. O que ele segura vem do plano da conta, e não de uma linha de configuração do motor. É por isso que a mensagem pode nomear um recurso que, no motor, não tem tecto nenhum.
2 Da sua aplicação, que abre links e não os fecha. É a causa mais comum em código feito à medida. Um programa que abre uma ligação dentro de um ciclo, ou que usa ligações persistentes sem as reaproveitar, acumula conexões vivas que não fazem nada. Em pouco tempo tem dezenas abertas para servir um visitante.
3 Do tecto do servidor inteiro. As 151 conexões são repartidas por todo mundo. Se as esgotar sozinho, o motor recusa as que sobram, e a recusa pode sair com esta redação. É raro, e quando acontece é sempre porque houve uma conta a abrir ligações sem as fechar.

Ler o padrão antes de mexer no código

Quando o erro aparece diz-lhe quase tudo. Tome nota da hora antes de fazer seja o que for.

Quando aparece Para onde aponta
Só às horas de mais visitas Consumo. A aplicação é pesada de mais para o que a conta tem, ou há uma página a fazer trabalho a mais. Veja o que consome CPU num site.
Sempre à mesma hora certa Uma tarefa agendada. Ou corre com frequência demais, ou demora mais do que o intervalo e começa uma segunda cópia por cima da primeira. Veja tarefas agendadas.
Começou depois de uma instalação ou de uma atualização É o código novo. Desligue o que instalou e confirme antes de procurar mais longe.
Com o site praticamente parado Alguma coisa está a ligar-se por fora do site: uma integração, um programa no seu escritório, um robot a varrer páginas.
Em todos os sites da conta ao mesmo tempo É a conta que está no limite, e não um site. A soma é que conta, e um site só pode estar puxando por todos.

O que fazer, por ordem

1 Vá buscar a hora exata ao registro de erros do PHP. A mensagem que o visitante vê é um resumo; a linha com a hora e o arquivo está no registro. É a diferença entre adivinhar e saber: onde está o registro de erros do PHP.
2 Olhe para o consumo da conta à volta dessa hora, na página de consumo de recursos do cPanel. O freio em si é coisa do servidor e não tem tela nenhuma no seu painel: não o vá procurar. O que tem são os gráficos do que a conta gastou, e é neles que se vê o pico e a que horas foi: como monitorar o desempenho do site no cPanel. Em tempo real, por SSH, é ver o consumo em tempo real.
3 Procure conexões que ficam abertas. Em código próprio, a regra é uma conexão por pedido, aberta o mais tarde possível e fechada no fim, mesmo quando o programa sai por um erro. Uma conexão persistente que ninguém reaproveita é pior do que uma conexão normal.
4 Baixe o trabalho em vez de pedir mais espaço. Consultas sem índice, páginas sem cache e tarefas a rodar de minuto a minuto são o que enche a conta. Só depois disto é que mudar de plano faz sentido.
Subir um tecto nunca curou uma fuga. Se a aplicação abre links e não os fecha, dar-lhe mais links apenas adia o mesmo erro, e entretanto o consumo da conta sobe e o site fica mais lento para todos. Corrija a fuga primeiro; se depois disso o plano ficar mesmo curto, aí sim vale a pena mudar.

Se o que está vendo não é este erro mas sim uma página em branco a dizer que não há ligação à base, a lista de causas é outra: quando o site diz que não consegue ligar ao banco de dados.

Diga-nos o domínio e a hora a que o erro apareceu, que vamos ver o consumo da conta nesse momento.

Abrir um pedido de suporte

VEJA TAMBÉM

Planos de hospedagem e o que cada um inclui

Política de Suporte: até onde vai a nossa ajuda

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde R$ 36,30/mês (plano de 3 anos, com cupom)

Ver planos
Esta resposta foi útil? Sua resposta nos ajuda a melhorar este artigo.