OBS/Adminhilfe/Häufige MySQL Fehler: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Für diese Seite wurde eine Zugriffsbeschränkung eingerichtet. Falls du diese Nachricht siehst, bist du nicht berechtigt, diese Seite einzusehen.
Keine Bearbeitungszusammenfassung
Zeile 34: Zeile 34:
http://dev.mysql.com/doc/refman/5.6/en/too-many-connections.html
http://dev.mysql.com/doc/refman/5.6/en/too-many-connections.html


== ERROR 1227 (42000) at line xxx: Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation ==
Kann beim Import eines Dumps auftreten. In diesem Fall wird wahrscheinlich versucht, einen View oder eine Stored Procedure mit einem Security Definer ( /''!50013 DEFINER=<code>root</code>@<code>localhost</code> SQL SECURITY DEFINER''/ ) anzulegen. Dieser würde dafür sorgen, das z.B. die Procedure mit anderen Rechten läuft, als der angemeldete User.
Beheben lässt sich das, indem man dem User, der den Import durchführt, SYSTEM_USER Previlegien gibt:<source lang="sql">
GRANT SYSTEM_USER ON *.* to user;
</source>Dieser Befehl sollte immer auf dem Server als root@localhost ausgeführt werden.


==.deleted Dateien im Datenbankverzeichnis==
==.deleted Dateien im Datenbankverzeichnis==

Version vom 2. September 2025, 10:10 Uhr

Dies ist eine zugriffsgeschützte Seite.


Admin-Hilfe

OBS-Administration / Installation
kundenspezifische Anpassungen
OBS Protokolle
Shop-Administration

MySQL Fehler

Hier werden verschiedene MySQL-Probleme und deren Lösungen aufgeführt.

Umbrüche in Datenbankfeldern

Ein Umbruch steht in der Datenbank als CHAR(13,10) und wird meistens durch 2 nebeneinander stehende Kästchen dargestellt. Umbrüche können mit einem einfachen Replace aus der Datenbank entfernt werden:

UPDATE rechsta SET a_name = REPLACE( a_name, CHAR(13,10), '' );

Host 'host_name' is blocked because of many connection errors

Es kann passieren, dass beim Verbinden zur Datenbank von einem bestimmten PC aus die Meldung Host 'host_name' is blocked because of many connection errors angezeigt wird.
Kurzfristig kann dieses Problem behoben werden, indem der Befehl

FLUSH HOSTS;

ausgeführt wird. Es sollte zudem folgender Befehl ausgeführt werden, damit mehr Verbindungsfehler zulässig sind:

SET GLOBAL max_connect_errors = 1000;

Dieser Wert gilt allerdings nur für die aktuelle Sitzung. Sobald die Datenbank das nächste mal neu gestartet wird, werden die Werte aus der my.ini verwendet. Es sollte auf jedenfall also auch in der my.ini der Wert angepasst werden. Hierzu sucht man den Eintrag max_connect_errors und ändert den Wert hier ebenfalls auf 1000.

Weitere Informationen zu dem Problem gibt es auf der MySQL Seite:
Blocked-Host Problem

Too many connections

Bei großen Firmen kann die maximale Anzahl an zulässigen Verbindungen überschritten werden. Jeder weitere Versuch sich zu verbinden wird dann mit der Meldung Too many connection abgelehnt. Normalerweise reserviert MySQL eine extra Sitzung für Super-User, da sich bei OBS jedoch jeder mit dem selben MySQL Benutzer anmeldet kann es notwendig sein, einen OBS Dienst zu beenden um auf die Datenbank zugreifen zu können. Für die aktuelle Sitzung sollte dann die Anzahl der Verbindungen mit folgendem Befehl hochgesetzt werden:

SET GLOBAL max_connections = 1000;

Dieser Wert gilt allerdings nur für die aktuelle Sitzung. Sobald die Datenbank das nächste mal neu gestartet wird, werden die Werte aus der my.ini verwendet. Es sollte auf jedenfall also auch in der my.ini der Wert angepasst werden. Hierzu sucht man den Eintrag max_connections und ändert den Wert hier ebenfalls auf 1000. (oder einen höheren Wert, je nach Bedarf)

Weitere Informationen zu dem Problem gibt es auch im MySQL Handbuch: http://dev.mysql.com/doc/refman/5.6/en/too-many-connections.html


ERROR 1227 (42000) at line xxx: Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation

Kann beim Import eines Dumps auftreten. In diesem Fall wird wahrscheinlich versucht, einen View oder eine Stored Procedure mit einem Security Definer ( /!50013 DEFINER=root@localhost SQL SECURITY DEFINER/ ) anzulegen. Dieser würde dafür sorgen, das z.B. die Procedure mit anderen Rechten läuft, als der angemeldete User.

Beheben lässt sich das, indem man dem User, der den Import durchführt, SYSTEM_USER Previlegien gibt:

GRANT SYSTEM_USER ON *.* to user;

Dieser Befehl sollte immer auf dem Server als root@localhost ausgeführt werden.

.deleted Dateien im Datenbankverzeichnis

HINWEIS: Bisher wurde dieses Verhalten nur bei GData beobachtet

Es kann vorkommen, dass Dateien der Datenbank vom Vierenscnanner umbenannt werden und somit ein Zugriff nicht mehr möglich ist. Bei Geostones ergab sich dabei folgendes Bild:

Datei + 8-stelliger Hex + .deleted
Beispiel: loginproto.MYI.047BCBFF.deleted

Lösung des aktuen Problems

Um dies schnell wieder in den Ursprung zu versetzen, kann man das Multi-Umbenennungs-Tool vom Total Commander verwenden.

Dabei ist auf folgendes zu achten: 1. für die Suche die Optionen [E] und RegEx aktivieren, damit Dateiendung ebenfalls beachtet wird und reguläre Ausdrücke verwendet werden können 2. Suche nach dem Muster Punkt + beliebige Zeichen (hier unsere eigentliche Dateiendung) + Punkt + beliebige Zeichen (hier der Hex-Wert) + Punkt + beliebige Zeichen (alternativ könnte auch fest nach "deleted" gesucht werden) 3. Ersetzen durch auf Punkt + $1. Die beliebigen Werte der Suche können der Reihenfolge nach mich $1, $2, $3 usw. angesprochen und verwendet werden.

So suchen wir über den vollen Dateinamen und ersetzen den Mist, den der Vierenscanner produziert hat wieder mit der ursprünglichen Endung. MySQL Deleted Files.png

\.(.*)\.(.*)\.(.*)

Langfristige Lösung

Um dem Problem vorzubeugen sollte im MySQL Ordner ein TEMP Ordner angelegt und in der Datenbank in der my.ini eingetragen werden. Beispiel:

tmpdir = "C:/MySQL/TEMP"

Anschließend muss in GData eine Außnahme für dieses Verzeichnis hinzugefügt werden.

MySQL Crash

Wenn eine MySQL crasht (z.B. durch einen Stromausfall des Servers), sollte die folgende Liste der Reihe nach bearbeitet werden.
Es wird hierbei davon ausgegangen, dass es nicht mehr möglich ist, die Datenbank normal zu starten.

Fehlerprotokkoll prüfen

Zunächst sollte ein Blick in die .ERR Datei des MySQL Servers geworfen werden um zu schauen, was überhaupt los ist.

Recovery Modus

Da die DB sich nicht starten lässt kann nun in der My.INI der Recovery Modus aktiviert werdern, in dem der folgende Eintrag ganz unten eingefügt wird:

innodb_force_recovery = 1

Hierbei wird die erste Stufe des Recovery Modus verwendet (vgl. [MySQL Anleitung zu forcing innodb recovery]). Nun sollte erneut versucht werden die Datenbank zu starten. Ist dies nicht möglich wird der Eintrag in der My.INI nun erhöht:

innodb_force_recovery = 2

Nun wird wieder versucht die Datenbank zu starten. Der Wert muss nun schrittweise erhöht werden bis sich die Datenbank wieder starten lässt. Je nachdem bei welchem Wert dies passiert sind unterschiedliche Herangehensweisen möglich.

Recovery Level 1-2

Als Erstes sollte ein Dump der DB erstellt werden.

Falls der Fehler im Tablespace liegt kann versucht werden die Datenbank zu reparieren. Hierzu folgende Schritte befolgen:

  1. Im error.log nachsehen, welche Tabellen betroffen sind.
  2. für die betroffenen Tabellen den Tablespace neu aufbauen:
    ALTER TABLE tabellenname ENGINE=InnoDB;
  3. Datenbank runterfahren und innodb_force_recovery wieder aus der My.INI rausnehmen.
  4. Es sollte für alle Tabellen ein repair ausgeführt werden und anschließend geprüft werden ob alles läuft.

Sollte die Reparatur nicht möglich sein oder fehlschlagen muss mit dem Punkt Datenkbank defekt fortgefahren werden.

Recovery Level >= 3

In diesem Fall muss ein Dump der gesamten Datenbank erstellt werden und anschließend mit dem Punkt Datenkbank defekt fortgefahren werden.

Datenbank lässt sich gar nicht starten

In diesem Fall lassen sich die aktuellen Daten nicht mehr retten und es muss auf die letzte Datenbank-Sicherung zurück gegriffen werden um an ein Dump zu kommen. Wenn es eine Sicherung gibt, bitte mit dem Punkt Datenkbank defekt fortfahren.

Datenbank defekt

Wenn die Datenbank defekt ist und nicht mehr zu retten ist muss MySQL eine Sicherung in Form eines Dumps neu eingespielt werden. Um MySQL nicht komplett neu installieren und konfigurieren zu müssen kann eine Reinitalisierung mit folgenden Schritten durchgeführt werden.

  1. Datadir umbenennen (In der Regel ist dies der Pfad ..\MySQL\Datenbanken)
  2. Datenbank neu initialisieren. Hierzu kann folgender Befehl verwendet werden:
    ..\mysqld.exe --defaults-file='c:\MySQL\Datenbanken\my.ini' --initialize --console
    HINWEIS: Es wird hierbei für den ROOT-Benutzer der Datenbank ein temporäres Passwort angezeigt. Dieses unbedingt notieren!
  3. Mit Heidi und dem temporären Root-Passwort einloggen und das Passwort ändern. Neuen root-Benutzer für % anlegen (wie bei einer Neuinstallation)
  4. Dump einspielen.