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

O site pára, ou pára só uma página, e no registo de erros fica uma linha parecida com esta: User «conta_utilizador» has exceeded the «max_user_connections» resource. Lida à pressa, parece dizer que lhe pusémos um tecto 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 correcçã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 omissã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 a base de dados, abre uma ligação, faz o que tem a fazer e fecha-a. Numa máquina partilhada há duas contagens dessas ligações, e confundem-se muito.

Definição O que conta Neste servidor
max_connections As ligações abertas ao mesmo tempo no servidor inteiro, somando toda a gente que lá está. 151
max_user_connections As ligações abertas ao mesmo tempo por cada utilizador de base 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 está a seguir.

De onde vem, então, a mensagem

1 Do travão de consumo da conta. Estes servidores correm o MySQL Governor do CloudLinux, que mede quanto cada conta gasta em base de dados e segura quem dispara, para que uma conta não pare a máquina de toda a gente. 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 ligações e não as 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 ligaçõ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 ligações são repartidas por toda a gente. 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 demasiada frequência, 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 actualizaçã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 a puxar por todos.

O que fazer, por ordem

1 Vá buscar a hora exacta ao registo de erros do PHP. A mensagem que o visitante vê é um resumo; a linha com a hora e o ficheiro está no registo. É a diferença entre adivinhar e saber: onde está o registo de erros do PHP.
2 Olhe para o consumo da conta à volta dessa hora, na página de consumo de recursos do cPanel. O travão em si é coisa do servidor e não tem ecrã nenhum 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 monitorizar o desempenho do site no cPanel. Em tempo real, por SSH, é ver o consumo em tempo real.
3 Procure ligações que ficam abertas. Em código próprio, a regra é uma ligação por pedido, aberta o mais tarde possível e fechada no fim, mesmo quando o programa sai por um erro. Uma ligação persistente que ninguém reaproveita é pior do que uma ligação normal.
4 Baixe o trabalho em vez de pedir mais espaço. Consultas sem índice, páginas sem cache e tarefas a correr 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 ligações e não as fecha, dar-lhe mais ligações 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á a ver 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 à base 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 9.000,00 Kz/mês

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?