✦ Oplossingen · Database (MySQL/MariaDB)

MySQL/MariaDB: Too many connections (fout 1040)

'ERROR 1040 (HY000): Too many connections' betekent dat alle toegestane databaseverbindingen bezet zijn. Zo vind je wie ze vasthoudt en wanneer max_connections omhoog mag.

Waarom gebeurt dit?

Een MySQL- of MariaDB-server accepteert maximaal max_connections gelijktijdige verbindingen. Zijn die allemaal bezet, dan weigert hij nieuwe met fout 1040. Voor je website betekent dat: pagina's laden niet of tonen een databasefout.

Verhogen is soms nodig, maar meestal is het een symptoom. Verbindingen blijven hangen door trage queries die elkaar blokkeren, door scripts die verbindingen niet sluiten, of door een piek in verkeer (vaak bots) waarbij elke aanvraag een eigen verbinding opent.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Kijk wat er nu draait

    Log in als beheerder (MySQL reserveert één extra verbinding voor een gebruiker met het recht CONNECTION_ADMIN of SUPER) en bekijk de lijst met processen.

    SHOW FULL PROCESSLIST;
    SHOW STATUS LIKE 'Threads_connected';
    SHOW VARIABLES LIKE 'max_connections';
  2. Zoek trage of slapende verbindingen

    Veel regels met dezelfde trage query wijzen op een ontbrekende index of een lock. Veel 'Sleep'-verbindingen wijzen op code die verbindingen openhoudt; verlaag dan wait_timeout.

  3. Verhoog max_connections met verstand

    Elke verbinding kost geheugen. Verhoog de waarde in stappen en houd het geheugengebruik in de gaten.

    -- tijdelijk, tot de volgende herstart
    SET GLOBAL max_connections = 300;
    
    # blijvend, in de configuratie (bijv. /etc/mysql/mariadb.conf.d/50-server.cnf)
    [mysqld]
    max_connections = 300
  4. Beperk het aantal PHP-processen

    Elk PHP-FPM-proces kan een eigen verbinding openen. Staat pm.max_children veel hoger dan de database aankan, dan loopt die bij drukte vol. Stem ze op elkaar af.

  5. Hou bots tegen

    Een groot deel van de verbindingen komt soms van bots op wp-login.php, xmlrpc.php of zoekpagina's. Beperk die met een firewallregel of rate limiting in de webserver.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Is max_connections verhogen genoeg?

Soms tijdelijk. Als trage queries of bots de oorzaak zijn, lopen ook meer verbindingen vol. Los de oorzaak op.

Ik kan zelf ook niet meer inloggen op de database.

Wacht even of herstart de databaseservice als laatste redmiddel. Een gebruiker met het beheerrecht krijgt in MySQL één gereserveerde extra verbinding.

Hoe vaak komt dit door één trage query?

Regelmatig: één query die een tabel vergrendelt, laat alle volgende wachten, en die houden elk een verbinding vast. Zie trage database en indexen.