Als Webserver für die Entwicklung meiner Applikationen und Webseiten benutze ich die umfangreichen Funktionen von XAMPP.

Seit dem ich auf einer XAMPP Version mit einer PHP 7.x Version entwickle, habe ich bereits öfter das Problem gehabt, dass sich aus heiterem Himmel die MySQL Datenbank nicht mehr starten ließ. Das zeigte sich wie folgt: Beim Klick auf den MySQL „starten“ Button sah für 2 Sekunden zunächst alles aus wie immer. Nach ca. 2 Sekunden dann beendete sich MySQL und im XAMPP Control Panel Log Fenster wurde folgender Fehler angezeigt:

12:29:33  [mysql] 	Statusänderung erkannt: gestartet
12:29:35  [mysql] 	Statusänderung erkannt: gestoppt
12:29:35  [mysql] 	Fehler: MySQL wurde unerwartet beendet
12:29:35  [mysql] 	Ursache könnte ein geblockter Port, fehlende Abhängigkeiten,
12:29:35  [mysql] 	fehlende Berechtigungen, ein Absturz oder ein Abbruch einer anderen Methode sein.
12:29:35  [mysql] 	Drücke den Logs Button um error logs zu sehen und prüfe
12:29:35  [mysql] 	im Windows Event Viewer für weitere Hinweise
12:29:35  [mysql] 	Wenn du weitere Hilfe benötigst, kopiere den kompletten Inhalt des Log Fensters
12:29:35  [mysql] 	und füge ihn als Ergänzung in einem neuen Forum Eintrag hinzu.

…hilft auch, ist aber nicht sehr Elegant

Nach einigem Herumprobieren habe ich mich – letztendlich auch aus zeitlichen Gründen – entschlossen die XAMPP Software in einem anderen Verzeichnis erneut zu installieren. Nachdem ich in der „frischen“ Installation die Funktion der MySQL Datenbank getestet hatte, habe ich dann die DB-Dateien aus dem mysql/data Verzeichnis der defekten Installation in die „frische“ Umgebung kopiert … und zwar zunächst nur für einzelnen (aktuelle) Projekte.

Dann war erstmal Ruhe und alles funktionierte prima.

…bis heute Morgen: Das gleiche Problem trat wieder auf. MySQL ließ sich nicht starten. Grund genug, mir die Sache etwas genauer anzuschauen…

Wer suchet, der findet…

Zunächst habe ich mir natürlich das MySQL Logfile angesehen. Allerdings war dort kein Hinweis auf kritische Fehler zu finden. Auch als ich den Abbruch mehrfach forciert habe, gab es keine neuen Erkenntnisse in dieser Logdatei. Also Sackgasse.

Die nächste Idee, die mysql.exe über die Kommandozeile zu starten zeigte das gleiche Verhalten: nach wenigen Sekunden beendete sich mysql.exe wieder. Hier gab es lediglich den Fehler „cannot connect to localhost (Error unknown)“

Dann habe ich mich kurz von den vielen Google Treffern zu diesem Problem iritieren lassen und habe mir die Nutzung des MySQL Standard-Ports 3306 auf meinem Rechner angesehen. Das Ergebnis war vorhersehbar: kein Programm oder Dienst außer MySQL nutzt diesen Port. Also wieder Sackgasse.

Letzte Station wäre dann noch das windowseigene System-Log. Soetwas kennt man eher als „system.log“ von Unix Systemen. In der Welt der normalen Windows Benutzer hat man eher keinen Bedarf sich die Details zu Systemereignissen anzusehen.
Start der Windows Ereignisanzeige über das Startmenü oder

%windir%\system32\eventvwr.msc /s

Darin finden man eine Aufsummierung der Events in den verschiedenen Fehlerklassen. Um herauszufinden, ob in der Ergenisanzeige Fehler durch den MySQL Abbruch ankommen, habe ich mir die Zählerstände gemerkt, den Fehler provoziert und die Zählerstände nach der Aktualisierung der Ereignisanzeige verglichen.
…und siehe da, es gab neue Meldungen in der Klasse „Fehler„. Bis zu der Fehlerquelle „MySQL“ hat man sich dann schnell durchgeklickt und findet:

Fatal error: Can't open and lock privilege tables: Incorrect key file for table '.\mysql\user'; try to repair it

For more information, see Help and Support Center at http://www.mysql.com.  

Also haben wir es mit einer korrupten Tabelle der MySQL Infrastruktur zu tun. Die Tabelle „user“ scheint defekt zu sein.

Lösung…

Zum Glück bringt MySQL eine Reperatur-Funktion für Tabellen mit. Diese lässt sich wie folgt auf die betroffene Tabelle anwenden:

Um eine Tabelle reparieren zu können muss der MySQL Dienst gestartet werden. Haha, wird sich der Eine oder Andere denken, „Genau das ist doch das Problem!“. Aber es geht über die Kommandozeile unter Zuhilfenahme eines weiteren Aufrufparameters:

mysqld --skip-grant-tables

Dieser Aufruft startet MySQL quasi ein einer Art „Light“ Modus.
In einem weiteren Fenster kann man dann einen MySQL-Client starten:

....mysql\bin>mysql
MariaDB [(none)]> use mysql
Database changed
MariaDB [mysql]> repair table user use_frm;
+------------+--------+----------+-------------------------------------+
| Table      | Op     | Msg_type | Msg_text                            |
+------------+--------+----------+-------------------------------------+
| mysql.user | repair | warning  | Number of rows changed from 0 to 11 |
| mysql.user | repair | status   | OK                                  |
+------------+--------+----------+-------------------------------------+
2 rows in set (0.02 sec)

MariaDB [mysql]> exit
Bye

Anschliessend kann der MySQL „Light“ Modus wieder beendet bzw. geschlossen werden. MySQL lasst sich nun wieder wie gewohnt starten und stoppen.

Fazit

Die Windows Ereignisanzeige ist ein wertvolles Hilfsmittel um, zunächst unklare scheinende Fehler, besser analysieren zu können.

Leider konnte ich nicht herausfinden, warum die „user“ Tabelle plötzlich korrupt wurde. Vielleicht kann ich bei zukünftigen fehlern ein Muster erkennen.

Ich hoffe dieser Beitrag kann jemandem dabei helfen dieses Problem schnell zu lösen.

Kommentar schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.