Die häufigsten MySQL-Fehler und ihre Lösung
Wer mit MySQL arbeitet, kennt das: Plötzlich geht nichts mehr, eine kryptische Fehlermeldung starrt dich an, und der erste Impuls ist Panik. Die gute Nachricht — die meisten MySQL-Fehler sind gut dokumentiert und lassen sich mit wenigen Handgriffen beheben. Ich hab dir hier die häufigsten Kandidaten zusammengestellt, die mir in über 15 Jahren Datenbank-Administration immer wieder begegnet sind.
1. Fehler beim Aufbau einer Datenbankverbindung
Der Klassiker, besonders bei WordPress-Installationen. Du siehst nur noch eine weiße Seite mit der Meldung „Fehler beim Aufbau einer Datenbankverbindung“.
Ursachen
- Falsche Zugangsdaten in der Konfigurationsdatei (z.B.
wp-config.php) - MySQL-Server läuft nicht
- Datenbank existiert nicht oder wurde gelöscht
- Hostname ist falsch (oft
localhostvs. konkreter Servername beim Hoster)
Lösung
Zuerst prüfen, ob MySQL überhaupt läuft:
sudo systemctl status mysql
# oder bei MariaDB:
sudo systemctl status mariadb
Falls der Dienst gestoppt ist:
sudo systemctl start mysql
Dann die Zugangsdaten in deiner Konfigurationsdatei kontrollieren. Bei WordPress steht alles in der wp-config.php:
define('DB_NAME', 'meine_datenbank');
define('DB_USER', 'mein_benutzer');
define('DB_PASSWORD', 'mein_passwort');
define('DB_HOST', 'localhost');
Bei vielen Hostern wie Strato oder IONOS ist der DB_HOST nicht localhost, sondern ein spezieller Hostname wie rdbms.strato.de. Schau in deinem Hosting-Panel nach.
2. Can’t connect to local MySQL server through socket
Die vollständige Meldung lautet meist: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
Ursache
MySQL ist entweder nicht gestartet, oder der Socket-Pfad stimmt nicht überein. Das passiert häufig nach Server-Neustarts oder Konfigurationsänderungen.
Lösung
# Prüfen ob MySQL läuft
ps aux | grep mysql
# Socket-Datei suchen
find / -name "mysqld.sock" 2>/dev/null
# MySQL starten falls nötig
sudo systemctl start mysql
Falls der Socket an einem anderen Ort liegt, kannst du das in der /etc/mysql/my.cnf anpassen:
[client]
socket = /var/lib/mysql/mysql.sock
[mysqld]
socket = /var/lib/mysql/mysql.sock
Alternativ verbindest du dich über TCP statt Socket:
mysql -u root -p --protocol=TCP
3. Access denied for user ‚root’@’localhost‘
Du versuchst dich als root anzumelden und bekommst: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Ursache
Falsches Passwort, oder der root-User hat keine Berechtigung für die gewählte Authentifizierungsmethode.
Lösung
Bei neueren MySQL/MariaDB-Versionen verwendet root oft auth_socket statt Passwort. Dann funktioniert nur:
sudo mysql -u root
Um das root-Passwort zurückzusetzen, startest du MySQL im Safe Mode:
# MySQL stoppen
sudo systemctl stop mysql
# Im Safe Mode starten
sudo mysqld_safe --skip-grant-tables &
# Einloggen und Passwort setzen
mysql -u root
# In der MySQL-Shell:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NeuesPasswort123!';
FLUSH PRIVILEGES;
EXIT;
Danach MySQL normal neu starten:
sudo systemctl restart mysql
4. character_set_client can’t be set to NULL
Dieser Fehler tritt häufig beim Import von Dumps auf, die mit einer anderen MySQL-Version erstellt wurden — ein typisches Versionskompatibilitäts-Problem.
Ursache
Die Dump-Datei enthält SET-Anweisungen für Zeichensätze, die deine MySQL-Version nicht kennt — oder es gibt einen Mismatch zwischen Client- und Server-Zeichensatz. Eine ausführliche Anleitung findest du im Artikel MySQL-Zeichensatz und Umlaute richtig konfigurieren.
Lösung
Vor dem Import den Zeichensatz explizit setzen:
mysql -u root -p --default-character-set=utf8mb4 meine_datenbank < dump.sql
Oder direkt im Dump am Anfang einfügen:
SET NAMES 'utf8mb4';
SET CHARACTER SET utf8mb4;
5. Serverfehler 500 (Internal Server Error)
Der Fehler 500 ist eigentlich kein reiner MySQL-Fehler, aber er taucht oft in Zusammenhang mit Datenbank-Problemen auf — besonders bei PHP-Anwendungen.
Ursachen
- PHP-Skript bricht wegen fehlgeschlagener DB-Verbindung ab (besonders nach einer PHP 7/8 Migration)
.htaccess-Fehler- PHP-Memory-Limit erreicht
- Fehlerhafte Datenbankabfrage ohne Fehlerbehandlung
Lösung
Zuerst das Apache/PHP Error-Log prüfen:
tail -50 /var/log/apache2/error.log
# oder
tail -50 /var/log/nginx/error.log
PHP-Fehlerausgabe temporär aktivieren (nur zum Debuggen!):
// Am Anfang deines PHP-Skripts:
ini_set('display_errors', 1);
error_reporting(E_ALL);
6. Unknown column 'xyz' in 'field list'
Meldung: ERROR 1054 (42S22): Unknown column 'name' in 'field list'
Ursache
Die Spalte existiert nicht in der Tabelle. Tippfehler, falscher Tabellenname, oder die Datenbank-Struktur wurde geändert.
Lösung
Spalten der Tabelle prüfen:
DESCRIBE meine_tabelle;
-- oder detaillierter:
SHOW FULL COLUMNS FROM meine_tabelle;
Falls die Spalte fehlt und du sie brauchst:
ALTER TABLE meine_tabelle ADD COLUMN name VARCHAR(255) NOT NULL DEFAULT '';
7. Table 'datenbank.tabelle' doesn't exist
Meldung: ERROR 1146 (42S02): Table 'mydb.users' doesn't exist
Ursache
Die Tabelle wurde gelöscht, umbenannt, oder du bist in der falschen Datenbank. Bei Linux-Servern sind Tabellennamen case-sensitive — Users ist nicht gleich users.
Lösung
# Datenbank auswählen und Tabellen auflisten
USE meine_datenbank;
SHOW TABLES;
# Tabelle suchen (case-insensitive)
SHOW TABLES LIKE '%user%';
Falls das Problem case-sensitivity ist, kannst du in der my.cnf setzen:
[mysqld]
lower_case_table_names = 1
Achtung: Diese Einstellung sollte nur bei der Erstinstallation gesetzt werden. Nachträgliches Ändern kann zu Datenverlust führen.
8. Too many connections
Meldung: ERROR 1040 (HY000): Too many connections
Ursache
Das Verbindungslimit von MySQL ist erreicht. Standardmäßig sind 151 gleichzeitige Verbindungen erlaubt. Bei stark frequentierten Seiten oder schlecht programmierten Anwendungen, die Verbindungen nicht schließen, ist das schnell voll.
Lösung
Aktuelle Verbindungen prüfen:
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
Limit temporär erhöhen (bis zum nächsten Neustart):
SET GLOBAL max_connections = 300;
Permanent in der my.cnf:
[mysqld]
max_connections = 300
Gleichzeitig solltest du prüfen, ob schlafende Verbindungen das Problem sind:
SHOW PROCESSLIST;
-- Sleeping-Verbindungen manuell beenden:
KILL [process_id];
9. MySQL server has gone away
Meldung: ERROR 2006 (HY000): MySQL server has gone away
Ursache
Die Verbindung zum MySQL-Server wurde unterbrochen. Häufigste Gründe:
- Das Paket ist zu groß (
max_allowed_packetüberschritten) - Timeout erreicht (
wait_timeout) - MySQL wurde neugestartet oder ist abgestürzt
Lösung
Paketgröße und Timeout erhöhen in der my.cnf:
[mysqld]
max_allowed_packet = 256M
wait_timeout = 600
interactive_timeout = 600
Danach MySQL neu starten:
sudo systemctl restart mysql
10. Duplicate entry for key 'PRIMARY'
Meldung: ERROR 1062 (23000): Duplicate entry '42' for key 'PRIMARY'
Ursache
Du versuchst einen Datensatz mit einem Primary Key einzufügen, der bereits existiert. Passiert oft beim Import von Dumps oder bei fehlerhaften Auto-Increment-Werten.
Lösung
Auto-Increment-Wert prüfen und korrigieren:
SELECT MAX(id) FROM meine_tabelle;
ALTER TABLE meine_tabelle AUTO_INCREMENT = 43;
Beim Import kannst du auch REPLACE oder INSERT IGNORE verwenden:
-- Bestehenden Datensatz überschreiben:
REPLACE INTO meine_tabelle (id, name) VALUES (42, 'Neuer Wert');
-- Duplikat stillschweigend ignorieren:
INSERT IGNORE INTO meine_tabelle (id, name) VALUES (42, 'Wert');
11. Lock wait timeout exceeded
Meldung: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Ursache
Eine Transaktion wartet zu lange auf einen Lock, den eine andere Transaktion hält. Typisch bei gleichzeitigen Schreibzugriffen auf dieselben Datensätze.
Lösung
Blockierende Transaktionen finden:
SHOW ENGINE INNODB STATUS\G
-- oder ab MySQL 5.7:
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
Timeout erhöhen (Symptombekämpfung):
SET GLOBAL innodb_lock_wait_timeout = 120;
Die nachhaltige Lösung ist, die Anwendung so zu optimieren, dass Transaktionen kürzer laufen und Locks schneller freigegeben werden.
12. The table is full
Meldung: ERROR 1114 (HY000): The table 'xyz' is full
Ursache
Entweder ist die Festplatte voll, oder die Tabelle hat ihr Größenlimit erreicht (bei alten MyISAM-Tabellen oder Temp-Tables).
Lösung
# Festplattenspeicher prüfen
df -h
# Datenbankgröße prüfen
SELECT table_schema AS 'Datenbank',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Größe (MB)'
FROM information_schema.tables
GROUP BY table_schema;
Falls tmp_table_size das Problem ist:
[mysqld]
tmp_table_size = 256M
max_heap_table_size = 256M
Fazit
Die meisten MySQL-Fehler lassen sich mit einem klaren Kopf und den richtigen Befehlen schnell lösen. Mein Tipp: Bevor du wild an der Konfiguration drehst, lies die Fehlermeldung genau durch. MySQL sagt dir fast immer, wo das Problem liegt. Und bevor du irgendwas änderst — mach ein Backup. Klingt banal, rettet aber Nerven.
Falls du regelmäßig mit großen Datenbanken arbeitest, lohnt sich ein Blick auf automatisierte Backups per Cronjob und ein solides Monitoring deiner MySQL-Instanz.