Die häufigsten MySQL-Fehler und ihre Lösung

Häufige MySQL-Fehler erkennen und beheben

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 localhost vs. 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-sensitiveUsers 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.