OBS/Adminhilfe/Häufige MySQL Fehler: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „{{ZugriffOBS}} =MySQL Probleme (extern)= ==.deleted Dateien im Datenbankverzeichnis== {{Hinweis| Bisher wurde dieses Verhalten nur bei GData beobachtet}} Es ka…“) |
Ecks (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| (7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
{{ZugriffOBS}} | {{ZugriffOBS}} | ||
=MySQL Probleme ( | =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: | |||
<source lang="SQL"> | |||
UPDATE rechsta SET a_name = REPLACE( a_name, CHAR(13,10), '' ); | |||
</source> | |||
==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.<br/> | |||
Kurzfristig kann dieses Problem behoben werden, indem der Befehl | |||
<source lang="SQL"> | |||
FLUSH HOSTS; | |||
</source> | |||
ausgeführt wird. Es sollte zudem folgender Befehl ausgeführt werden, damit mehr Verbindungsfehler zulässig sind: | |||
<source lang="SQL"> | |||
SET GLOBAL max_connect_errors = 1000; | |||
</source> | |||
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:<br/> | |||
[http://dev.mysql.com/doc/refman/5.1/de/blocked-host.html 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: | |||
<source lang="SQL"> | |||
SET GLOBAL max_connections = 1000; | |||
</source> | |||
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=<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 (hier als Beispiel für den Standard User):<source lang="sql"> | |||
GRANT SYSTEM_USER ON *.* to 'root'@'%'; | |||
</source>Dieser Befehl sollte immer auf dem Server als root@localhost ausgeführt werden. | |||
==.deleted Dateien im Datenbankverzeichnis== | ==.deleted Dateien im Datenbankverzeichnis== | ||
{{Hinweis| Bisher wurde dieses Verhalten nur bei GData beobachtet}} | {{Hinweis| Bisher wurde dieses Verhalten nur bei GData beobachtet}} | ||
| Zeile 19: | Zeile 61: | ||
So suchen wir über den vollen Dateinamen und ersetzen den Mist, den der Vierenscanner produziert hat wieder mit der ursprünglichen Endung. | So suchen wir über den vollen Dateinamen und ersetzen den Mist, den der Vierenscanner produziert hat wieder mit der ursprünglichen Endung. | ||
[[Image:MySQL Deleted Files.png]] | [[Image:MySQL Deleted Files.png]] | ||
\.(.*)\.(.*)\.(.*) | |||
===Langfristige Lösung=== | ===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:<br/> | Um dem Problem vorzubeugen sollte im MySQL Ordner ein TEMP Ordner angelegt und in der Datenbank in der my.ini eingetragen werden. Beispiel:<br/> | ||
tmpdir = "C:/MySQL/TEMP" | 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.<br/> | |||
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. [[https://dev.mysql.com/doc/refman/8.4/en/forcing-innodb-recovery.html 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: | |||
#Im error.log nachsehen, welche Tabellen betroffen sind. | |||
#für die betroffenen Tabellen den Tablespace neu aufbauen: <pre>ALTER TABLE tabellenname ENGINE=InnoDB;</pre> | |||
#Datenbank runterfahren und ''innodb_force_recovery'' wieder aus der My.INI rausnehmen. | |||
#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 [[OBS/Adminhilfe/Häufige_MySQL_Fehler#Datenbank_defekt|Datenkbank defekt]] fortgefahren werden. | |||
===Recovery Level >= 3=== | |||
In diesem Fall muss ein Dump der gesamten Datenbank erstellt werden und anschließend mit dem Punkt [[OBS/Adminhilfe/Häufige_MySQL_Fehler#Datenbank_defekt|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 [[OBS/Adminhilfe/Häufige_MySQL_Fehler#Datenbank_defekt|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. | |||
#Datadir umbenennen (In der Regel ist dies der Pfad ''..\MySQL\Datenbanken'') | |||
#Datenbank neu initialisieren. Hierzu kann folgender Befehl verwendet werden:<pre>..\mysqld.exe --defaults-file='c:\MySQL\Datenbanken\my.ini' --initialize --console</pre>{{Hinweis|Es wird hierbei für den ROOT-Benutzer der Datenbank ein temporäres Passwort angezeigt. Dieses unbedingt notieren!}} | |||
#Mit Heidi und dem temporären Root-Passwort einloggen und das Passwort ändern. Neuen root-Benutzer für % anlegen (wie bei einer Neuinstallation) | |||
#Dump einspielen. | |||
Aktuelle Version vom 2. September 2025, 10:12 Uhr
Dies ist eine zugriffsgeschützte Seite.
- System Überwachung
- DEP deaktivieren
- Darstellung unter Windows 7
- Einwahl auf Windows 2000 Server
- Preislisten
- Datenbank Sicherung
- Customize
- Zentrale
- Support Macro
- Service Debug
- Historienprotokoll (Datenänderung OBS)
- Fernwartungsprobleme
- Startparameter
- Fehler beim Kassenabschluss
- Diverse Informationen
- A ras.pbk
- B Command Line Interpreter
- C File Zilla Benutzer XML erzeugen
- D1 OBS_UPDATE.EXE zum OBS Update Server hochladen
- D2 SUPPORT_MACRO zum OBS Update Server hochladen
- H1 Remote Service Protokoll-Übersicht (Alles)
- H Remote ServiceProtokoll-Übersicht
- I Remote Service Commands
- I1 (Admin) Globaler Hinweis für Updates
- J Liste der OBS Updates
- K Angemeldete Service Firmen
- L Systeminformationen einlesen
- M Kundendaten anzeigen
- M1 Kundendatenbankinformationen anzeigen
- N Kundendaten einlesen
- O Kunden-Update Informationen anzeigen
- P Modul Registrierung OBS
- Q App Verwaltung
- S1 Firmen Statistik Protokolle OBS
- S2 Statistik Notfallkassen
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 (hier als Beispiel für den Standard User):
GRANT SYSTEM_USER ON *.* to 'root'@'%';
Dieser Befehl sollte immer auf dem Server als root@localhost ausgeführt werden.
.deleted Dateien im Datenbankverzeichnis
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.
\.(.*)\.(.*)\.(.*)
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:
- Im error.log nachsehen, welche Tabellen betroffen sind.
- für die betroffenen Tabellen den Tablespace neu aufbauen:
ALTER TABLE tabellenname ENGINE=InnoDB;
- Datenbank runterfahren und innodb_force_recovery wieder aus der My.INI rausnehmen.
- 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.
- Datadir umbenennen (In der Regel ist dies der Pfad ..\MySQL\Datenbanken)
- 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! - Mit Heidi und dem temporären Root-Passwort einloggen und das Passwort ändern. Neuen root-Benutzer für % anlegen (wie bei einer Neuinstallation)
- Dump einspielen.