Wat de bezoeker ziet:
Error establishing a database connection
Meer niet. Geen stack trace, geen aanwijzing wat er fout is. Dat is met opzet zo: WordPress wil geen gevoelige info lekken (zoals MySQL-username of error-detail) richting publiek. De echte details staan in error_log — daar moet je heen. Maar vóórdat we naar logs gaan: dit zijn de vier meest voorkomende oorzaken in volgorde van frequentie.
De vier hoofdoorzaken
1. Verkeerde credentials in wp-config.php (50% van de gevallen)
De klassieker. Vooral na een migratie, hoster-overstap of een handmatige aanpassing van wp-config.php. WordPress probeert verbinding te maken met de credentials in dat bestand:
// In wp-config.php
define( 'DB_NAME', 'database_naam' );
define( 'DB_USER', 'database_user' );
define( 'DB_PASSWORD', 'database_pass' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
Klopt één van DB_NAME, DB_USER, DB_PASSWORD of DB_HOST niet, dan deze fout. Veelvoorkomende oorzaken:
- Migratie: nieuwe hoster heeft andere DB-credentials, oude wp-config.php is niet bijgewerkt
- Wachtwoord-reset: iemand heeft het MySQL-wachtwoord gewijzigd in cPanel maar wp-config niet aangepast
- Database hernoemd: in het hosting-panel hernoemd, maar wp-config heeft nog de oude naam
- Tikfout: copy-paste van credentials met onzichtbare karakters of trailing-spatie
2. MySQL-server draait niet (20%)
De server staat uit, herstart, of zit in onderhoud. Op shared hosting zelden door jou veroorzaakt — vaker:
- Hoster doet onderhoud (typisch 's nachts of in het weekend)
- MySQL is gecrasht door te weinig geheugen op de server
- De disk is vol, MySQL kan geen writes meer doen en verbreekt zichzelf
- Een hardware-issue in het datacenter
3. max_connections bereikt (15%)
MySQL heeft een limiet op gelijktijdige verbindingen (typisch 100–500). Als deze wordt bereikt — bijvoorbeeld door een DDoS-poging, een plugin met memory leaks, of cron-jobs die zich opstapelen — weigert MySQL nieuwe verbindingen.
4. Corrupte database of tabellen (10%)
Tabellen kunnen corrupt raken na een server-crash, bij volle disk, of na een onverwacht reboot tijdens een schrijf-actie. WordPress merkt dit soms tijdens het connect-attempt.
5. Andere — restant 5%
Firewall die poort 3306 blokt, MySQL bind-address verkeerd ingesteld, hoster die het account heeft opgeschort wegens betalingsachterstand, etc.
Diagnose in 5 minuten
Voor je iets aanpast, weet je welk scenario je hebt. Volg deze stappen in volgorde:
Stap 1: Werkt /wp-admin/ ook niet?
Probeer https://voorbeeld.nl/wp-admin/. Twee uitkomsten:
- Zelfde fout: WordPress kan helemaal niet verbinden → oorzaak 1, 2 of 3 (credentials/server/connections)
- Andere melding: "One or more database tables are unavailable. The database may need to be repaired." → oorzaak 4 (corrupte tabellen). Spring naar de repair-stap onder.
Stap 2: Check error_log
De echte foutmelding zit in het PHP error log. Locatie hangt af van hoster:
# cPanel: ~/error_log of in publiek-html-root
# DirectAdmin: ~/.../public_html/php-error.log of via control panel
# Plesk: /var/log/plesk/...
# Eigen VPS: /var/log/apache2/error.log of /var/log/nginx/error.log
Wat je zoekt:
# Verkeerde credentials (oorzaak 1):
mysqli_real_connect(): (HY000/1045): Access denied for user 'gebruiker'@'localhost'
# MySQL-server down (oorzaak 2):
mysqli_real_connect(): (HY000/2002): Can't connect to local MySQL server through socket
mysqli_real_connect(): (HY000/2003): Can't connect to MySQL server on '127.0.0.1'
# max_connections bereikt (oorzaak 3):
mysqli_real_connect(): (HY000/1040): Too many connections
# Database bestaat niet (oorzaak 1, variant):
mysqli_real_connect(): (HY000/1049): Unknown database 'verkeerde_naam'
De error-code (1045, 2002, 1040, 1049) vertelt je exact welk scenario je hebt.
Stap 3: Test de credentials los van WordPress
Maak test-db.php in je wp-root:
<?php
$link = mysqli_connect(
'localhost', // DB_HOST
'database_user', // DB_USER
'database_pass', // DB_PASSWORD
'database_naam' // DB_NAME
);
if (!$link) {
die('Connection failed: ' . mysqli_connect_error());
}
echo 'Verbinding werkt! MySQL versie: ' . mysqli_get_server_info($link);
mysqli_close($link);
?>
Open https://voorbeeld.nl/test-db.php. Krijg je dezelfde access-denied? Dan is je wp-config.php fóut. Werkt het? Dan ligt 't aan iets WordPress-specifieks (corrupte options-tabel, plugin die DB-init kapotmaakt). Verwijder dit testbestand direct na gebruik — het bevat je credentials in plain-text.
Fix per scenario
Fix scenario 1: Credentials kloppen niet
Pak de juiste credentials uit je hosting-panel:
- cPanel: MySQL Databases → daar staan database-namen en users
- DirectAdmin: MySQL Management → hetzelfde
- Plesk: Databases → klik door op je database
Reset het wachtwoord als je het kwijt bent:
- cPanel: MySQL Databases → bij user klikken → Change Password
- DirectAdmin: MySQL Management → user-edit → password
- Plesk: Database-user-detail → Change Password
Update wp-config.php met de juiste waarden. Tip: niet retypen maar kopiëren-en-plakken om typos te voorkomen, en check daarna of er geen onzichtbare spaties of newlines in zitten.
Fix scenario 2: MySQL-server is down
Op shared hosting kun je de server niet zelf herstarten. Drie acties:
- Check status-pagina van je hoster: status.hoster.nl of hun Twitter / X. Onderhouds-meldingen staan daar vaak.
- Mail / bel support: meld de fout, vraag of MySQL down is. Goede hosters reageren binnen het uur.
- Wachten: als 't onderhoud is, komt 't binnen een uur of twee terug. Plak intussen een onderhouds-pagina ervoor (zie WordPress maintenance mode zonder plugin).
Eigen VPS: log in via SSH en check:
sudo systemctl status mysql
sudo systemctl restart mysql
df -h # check of disk niet vol is
free -m # check geheugen
sudo tail -100 /var/log/mysql/error.log
Fix scenario 3: Te veel connecties
Tijdelijke piek of structureel probleem? Check:
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
SHOW PROCESSLIST;
Threads_connected dicht bij max_connections = je zit aan de limiet. Mogelijke oplossingen:
- Tijdelijk: MySQL herstarten (dropt alle bestaande connecties)
- Verhoog max_connections in
my.cnf— alleen op eigen VPS, niet op shared - Verlaag wait_timeout zodat idle-connecties sneller vrijkomen
- Vind de boosdoener: PROCESSLIST toont welke queries lang draaien. Als je één IP veel connecties ziet maken, mogelijk een DDoS-poging — blokkeer in firewall of via Cloudflare
Fix scenario 4: Corrupte tabellen
Activeer WordPress' ingebouwde repair-tool. Voeg toe aan wp-config.php:
define( 'WP_ALLOW_REPAIR', true );
Ga naar https://voorbeeld.nl/wp-admin/maint/repair.php — geen login vereist. Kies "Repair Database" (of "Repair and Optimize" bij twijfel). Wacht tot het klaar is.
Belangrijk: zet de regel direct daarna terug uit, of verwijder 'm. De repair-URL is publiek toegankelijk en je wilt niet dat een aanvaller de tool kan misbruiken.
Werkt de WordPress-repair niet? Dan via SSH:
# Check welke tabel kapot is
mysqlcheck -u user -p database_naam
# Repair (innodb-tabellen kunnen niet via REPAIR TABLE; gebruik mysqlcheck --auto-repair)
mysqlcheck --auto-repair --optimize -u user -p database_naam
Specifieke gevallen die ik vaak zie
Recent gemigreerd, oude wp-config achtergebleven
Klant had via FTP de hele site gekopieerd inclusief wp-config.php. Die wees nog naar de oude database. Fix: nieuwe credentials van de nieuwe hoster ingevuld, klaar. Lees: Website migreren zonder downtime.
DB_HOST is niet 'localhost' bij sommige hosters
Antagonist gebruikt soms localhost, soms een andere hostname. TransIP gebruikt vaak mysql.transip.nl. Bij DigitalOcean Managed Databases is het db-mysql-fra1-XXXX.b.db.ondigitalocean.com. Bij twijfel: hoster-documentatie of mail support.
Site werkte gisteren, ineens niet meer
9 van de 10 keer hosting-onderhoud of MySQL-crash. Wacht 30 minuten, refresh. Niet weg? Mail support. Het is zélden je eigen schuld als alles ineens stopt zonder dat je iets hebt aangepast.
Alleen wp-admin geeft de fout, frontend werkt?
Atypisch maar gebeurt. Vaak een corrupt wp_options-tabel waardoor admin-login faalt maar gecachte frontend-pagina's nog draaien. WP_ALLOW_REPAIR aanzetten en repareren.
Veelgestelde vragen
Mijn site werkt nu weer, hoe voorkom ik dat 't terugkomt?
Drie maatregelen: (1) zorg voor monitoring (UptimeRobot of Better Stack stuurt je een mail bij downtime), (2) hosting met MySQL-failover (managed hosting in plaats van zuinige shared), (3) backup-discipline — dagelijkse off-site backup zodat een crashed-DB niet je hele site kost.
Welke hostings hebben de minste 'database connection'-issues?
In mijn ervaring: managed WordPress-hosting (Kinsta, WP Engine, premium-tier bij Hostnet/TransIP) heeft het minst. Zuinige shared hosting (onder €5/maand) heeft het meest, vooral bij hosts die honderden klanten op één MySQL-instance plakken. Voor €7–10/maand zit je bij betere hosting.
Maakt WordPress vanzelf reconnect na MySQL-restart?
Ja. WordPress probeert per request opnieuw te verbinden. Zodra MySQL weer draait, werkt je site automatisch weer — geen actie nodig.
Kan ik de fout zelf customizen?
Ja. Maak een bestand wp-content/db-error.php met je eigen HTML. WordPress laadt die in plaats van de standaard "Error establishing a database connection". Goed voor een nettere onderhoudspagina met logo en contact-info.
Betekent deze fout dat mijn database is gehackt?
Niet automatisch. De meeste van deze fouten zijn infrastructureel (credentials, MySQL-state), niet kwaadaardig. Krijg je 'm vlak na een verdacht inlog of na het klikken op een link, controleer dan wel de DB-credentials in wp-config (zijn ze veranderd?). Bij twijfel: hack-recovery.