“Erro ao estabelecer conexão com o banco de dados” no WordPress: causa e solução
· 7 min de leitura
O que o erro significa
O servidor web está rodando, o PHP está rodando, o WordPress começou a carregar e parou no primeiro passo que precisa do banco de dados. A página inteira é substituída por uma frase: “Erro ao estabelecer conexão com o banco de dados” (em inglês, “Error establishing a database connection”). O WordPress não conseguiu abrir uma conexão com o MySQL ou o MariaDB usando os dados do wp-config.php.
Há dois motivos possíveis: ou o servidor de banco de dados não está atendendo (parado, sem espaço, lotado), ou os dados de acesso não servem (nome do banco, usuário, senha ou host errados). Um terceiro caso, mais raro, é uma tabela corrompida; aí o WordPress às vezes mostra a mesma frase, às vezes “Há um erro crítico no seu site.”.
Causas frequentes, na ordem em que vale verificar
- O MySQL ou o MariaDB está parado. O caso mais comum em servidor próprio. Quase sempre o motivo é falta de memória: o sistema encerrou o processo do banco (OOM killer) para sobreviver, muitas vezes de madrugada, durante um backup ou uma enxurrada de bots. O serviço não volta sozinho.
- Disco cheio. O banco não consegue gravar e recusa conexões, ou nem consegue iniciar. Logs e backups antigos são os culpados de sempre.
- Dados de acesso errados no
wp-config.php. Depois de uma migração, de uma troca de senha no painel ou de uma restauração,DB_NAME,DB_USER,DB_PASSWORDouDB_HOSTnão batem mais com o banco. - Tabelas corrompidas. Um desligamento abrupto ou um disco que encheu no meio de uma gravação deixa uma tabela (em geral
wp_options) marcada como danificada. - Limite de conexões atingido. Um plugin ou um pico de visitas abre conexões demais; o banco responde “Too many connections”.
- Limite da hospedagem. Em uma hospedagem compartilhada, o servidor de banco de dados é da hospedagem e pode estar sobrecarregado, em manutenção ou com seu usuário suspenso por consumo.
Se você é visitante
Não há nada para ajustar no seu aparelho: a frase vem do próprio site. Tente de novo em alguns minutos; se continuar, só o dono resolve.
Se o site é seu: verifique primeiro
Abra o website down checker: ele confirma que o site está fora do ar para todos e mostra o código HTTP visto de fora. Depois entre por SSH e siga a ordem das causas:
# 1. o banco está rodando?
systemctl status mysql
systemctl status mariadb
# 2. há espaço em disco?
df -h
df -i
# 3. os dados do wp-config.php funcionam?
grep -E "DB_NAME|DB_USER|DB_PASSWORD|DB_HOST" /var/www/example.com/wp-config.php
mysql -u usuario_do_wp -p -h localhost nome_do_banco -e "SELECT 1;"
# o que o banco disse antes de parar?
sudo journalctl -u mariadb -n 50
sudo tail -n 50 /var/log/mysql/error.log
Como ler: Active: inactive (dead) ou failed no systemctl é a causa 1; 100% em df -h ou em df -i é a causa 2; Access denied for user no mysql é a causa 3; Unknown database quer dizer que o nome do banco está errado ou o banco foi apagado; Can't connect to local MySQL server through socket aparece quando o serviço está parado ou DB_HOST aponta para o lugar errado; Out of memory no journalctl confirma que o sistema matou o processo.
Soluções no seu servidor
1. Iniciar o banco e evitar o próximo OOM
sudo systemctl start mariadb # ou mysql
systemctl status mariadb
sudo journalctl -u mariadb -n 30
Se o motivo foi memória, iniciar resolve por enquanto, mas o problema volta. Confira com free -h, reduza innodb_buffer_pool_size se ele ocupa a maior parte da memória, diminua pm.max_children no PHP-FPM e, se não houver swap, crie um pequeno.
2. Liberar espaço em disco
sudo du -xh /var --max-depth=2 | sort -h | tail -n 15
sudo journalctl --vacuum-size=200M
sudo apt clean
Remova backups antigos, logs rotacionados e caches do WordPress. Depois de liberar espaço, reinicie o banco: ele pode ter ficado em um estado inconsistente enquanto o disco estava cheio.
3. Corrigir os dados de acesso
Abra o wp-config.php e compare com o que o banco realmente tem:
define('DB_NAME', 'nome_do_banco');
define('DB_USER', 'usuario_do_wp');
define('DB_PASSWORD', 'senha');
define('DB_HOST', 'localhost');
Se a senha se perdeu, redefina no banco em vez de adivinhar: ALTER USER 'usuario_do_wp'@'localhost' IDENTIFIED BY 'senha_nova'; e FLUSH PRIVILEGES;, depois grave a mesma senha no wp-config.php. Em uma hospedagem compartilhada, o DB_HOST raramente é localhost: use o host que o painel do cliente indica.
4. Reparar tabelas corrompidas
Com o WP-CLI:
wp db check
wp db repair
Sem WP-CLI, acrescente ao wp-config.php a linha define('WP_ALLOW_REPAIR', true);, abra https://example.com/wp-admin/maint/repair.php, clique em reparar e remova a linha em seguida: enquanto ela existe, a página fica aberta a qualquer pessoa.
5. Limite de conexões
SHOW STATUS LIKE 'Max_used_connections'; e SHOW VARIABLES LIKE 'max_connections'; mostram se o limite foi atingido. Antes de aumentar, procure a consulta lenta que segura as conexões (SHOW PROCESSLIST;); um cache de página na frente do WordPress reduz muito o número de conexões.
Se o problema está na sua hospedagem
Em uma hospedagem compartilhada, o servidor de banco de dados é da hospedagem: você não consegue iniciá-lo nem liberar o disco dele. Se os dados no wp-config.php são os mesmos do painel do cliente e o erro continua, envie esta mensagem:
Prezados, meu site WordPress example.com mostra “Erro ao estabelecer conexão com o banco de dados” desde aproximadamente 3h (UTC). Os dados de acesso no wp-config.php são os mesmos do painel do cliente e não alterei nada do meu lado. O servidor de banco de dados da minha conta está parado, sobrecarregado ou em manutenção? Existe algum limite de conexões ou de consumo atingido pelo meu usuário?
Para não acontecer de novo
Um banco de dados que para é a falha que mais se anuncia antes: a memória vinha apertada, o disco vinha enchendo. O monitoramento de servidores com agente de servidor acompanha memória, disco e o serviço do MySQL ou MariaDB, e avisa quando ele para ou quando o disco passa do limite; uma verificação HTTP com palavra-chave percebe a frase de erro na primeira vez em que aparece. Para um site WordPress, a manutenção WordPress sob demanda cuida de atualizações e reparos, sem contrato. O site mostra um erro 500 em vez da frase? A causa está no PHP ou em um plugin, não no banco. Um erro 503 costuma ser sobrecarga ou modo de manutenção.
Fora do ar? Nós resolvemos. No seu servidor ou em uma hospedagem compartilhada com acesso SSH, o Quick Fix, o reparo automático a preço fixo, reinicia o banco parado depois que o teste da configuração passa e libera espaço em disco, 24 horas por dia, inclusive nos fins de semana; o Deep Fix cuida de dados de acesso, tabelas corrompidas e falta de memória, em blocos de 15 minutos; a estimativa é o valor máximo. Se a causa está na hospedagem, você recebe uma mensagem pronta para enviar a ela.
E agora
Verifique de fora
O site está fora do ar para todos ou só para você, e o que o servidor responde? Grátis, sem cadastro.
Verificador de site fora do arFora do ar? Nós resolvemos.
No seu servidor ou em uma hospedagem compartilhada com acesso SSH: Quick Fix a preço fixo para as causas mais comuns, Deep Fix cobrado em blocos de 15 minutos para todo o resto, 24/7. Preço visível antes do pedido.
Pedir um reparoOutros guias
- Site fora do ar: o que fazer nos primeiros 15 minutos
- Servidor fora do ar: o que verificar e em que ordem
- Erro 500 Internal Server Error: achar a causa nos logs e colocar o site de volta no ar
- Erro 502 Bad Gateway: achar a causa e resolver
- Erro 503: sobrecarga, manutenção ou limite da hospedagem?
- Erro 504 Gateway Timeout: achar o que está lento
- Erro 521 e 522 do Cloudflare: o servidor de origem não responde
- DNS_PROBE_FINISHED_NXDOMAIN: o domínio não responde mais
- ERR_CONNECTION_REFUSED: o servidor recusa a conexão
- ERR_CONNECTION_TIMED_OUT: o servidor não responde a tempo
- O que significa “Sua conexão não é particular” e como resolver
- ERR_SSL_PROTOCOL_ERROR: a conexão segura falha antes do certificado
- ERR_TOO_MANY_REDIRECTS: achar o loop de redirecionamentos e fechá-lo
- Erro 403 Forbidden: o que bloqueia o acesso ao seu site
- ERR_NAME_NOT_RESOLVED: o nome do site não é encontrado