Ich ging am Nachmittag zur Arbeit und war schockiert, als ich hörte, dass es ein Problem mit meiner dedecms-Website gab. Als ich sie besuchte, sah ich einen Vollbildfehler und die Fehlermeldung lautete:
Tabelle '.. „dedecmsv4dede_archives“ ist als abgestürzt markiert und sollte repariert werden.
Es heißt, dass die Artikeltabelle „dede_archives“ als problematisch markiert ist und repariert werden muss. Also habe ich schnell die historischen Daten wiederhergestellt und bin online gegangen, um die Ursache herauszufinden. Das Problem wird irgendwann gelöst sein. Die Lösung lautet wie folgt:
Suchen Sie das Tool bin/myisamchk im MySQL-Installationsverzeichnis und geben Sie in die Befehlszeile ein:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI.
Anschließend hilft Ihnen das Tool myisamchk bei der Wiederherstellung des Index der Datentabelle. Starten Sie MySQL neu und das Problem ist gelöst.
Problemanalyse:
1. Die Ursache des Fehlers war, dass es sich um einen Indexfehler handelte, der durch häufiges Abfragen und Aktualisieren der Tabelle dede_archives verursacht wurde. Da meine Seite nicht statisch generiert wurde, sondern eine dynamische Seite, stimme ich dieser Aussage voll und ganz zu . Es wird auch gesagt, dass die MYSQL-Datenbank aus irgendeinem Grund beschädigt wurde. Beispielsweise kann ein plötzlicher Stromausfall des Datenbankservers oder ein Vorgang an der Originaldatei der Tabelle bei der Bereitstellung von Diensten für die Datenbanktabelle dazu führen, dass die MYSQL-Datenbank beschädigt wird beschädigt. Die Tabelle ist beschädigt und die Daten können nicht gelesen werden. Kurz gesagt, die Uhr ist aufgrund unerklärlicher Probleme beschädigt.
Die Problemnummer ist 145
2. Lösung des Problems.
Wenn Sie versuchen, ein Problem mit einer beschädigten Tabelle zu beheben, gibt es drei Arten von Reparaturen. Wenn Sie eine Fehlermeldung erhalten, die besagt, dass eine temporäre Datei nicht erstellt werden kann, löschen Sie die in der Meldung angegebene Datei und versuchen Sie es erneut – dies ist normalerweise ein Überbleibsel eines früheren Reparaturvorgangs.
Die drei Korrekturen lauten wie folgt:
% myisamchk --recover --quick /path/to/tblName
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /path/to/tblName
Die erste ist die schnellste und wird zur Behebung der häufigsten Probleme verwendet; die letzte ist die langsamste und wird zur Behebung von Problemen verwendet, die mit anderen Methoden nicht behoben werden können.
Überprüfen und Reparieren von MySQL-Datendateien Wenn die oben genannten Methoden eine beschädigte Tabelle nicht reparieren können, können Sie, bevor Sie aufgeben, auch diese beiden Tipps ausprobieren:
Wenn Sie den Verdacht haben, dass in der Indexdatei (*.MYI) der Tabelle ein irreparabler Fehler aufgetreten ist oder die Datei sogar verloren gegangen ist, können Sie die Datendatei (*.MYD) und die Datenformatdatei (*.frm) verwenden regenerieren Sie es. Erstellen Sie zunächst eine Kopie der Datendatei (tblName.MYD). Starten Sie Ihren MySQL-Dienst neu und stellen Sie eine Verbindung zu ihm her. Verwenden Sie den folgenden Befehl, um den Inhalt der Tabelle zu löschen:
mysql> DELETE FROM tblName;
Beim Löschen des Tabelleninhalts wird eine neue Indexdatei erstellt. Melden Sie sich ab und schließen Sie den Dienst erneut. Überschreiben Sie dann die neue (leere) Datendatei mit der gerade gespeicherten Datendatei (tblName.MYD). Verwenden Sie abschließend myisamchk, um eine Standardreparatur durchzuführen (die zweite Methode oben), um die Indexdaten basierend auf dem Inhalt der Tabellendaten und der Formatdatei der Tabelle neu zu generieren.
Wenn die Formatdatei Ihrer Tabelle (tblName.frm) fehlt oder einen irreparablen Fehler aufweist, Sie aber wissen, wie Sie die Tabelle mit der entsprechenden CREATE TABLE-Anweisung neu generieren, können Sie eine neue .frm-Datei neu generieren und diese mit Ihren Datendateien verwenden und Indexdateien (wenn es ein Problem mit der Indexdatei gibt, verwenden Sie die oben beschriebene Methode, um eine neue Datei neu zu erstellen). Erstellen Sie zunächst eine Kopie der Daten- und Indexdateien und löschen Sie dann die Originaldateien (löschen Sie alle mit dieser Tabelle verbundenen Datensätze im Datenverzeichnis).
Starten Sie den MySQL-Dienst und erstellen Sie eine neue Tabelle mit der ursprünglichen CREATE TABLE-Datei. Die neue .frm-Datei sollte einwandfrei funktionieren, am besten führen Sie jedoch eine Standardreparatur durch (die zweite Methode oben).
3. Einführung in das Tool myisamchk (siehe das offizielle Handbuch von mysql).
Mit dem Dienstprogramm myisamchk können Sie Informationen zu Datenbanktabellen abrufen oder diese überprüfen, reparieren und optimieren. myisamchk gilt für MyISAM-Tabellen (Tabellen, die .MYI- und .MYD-Dateien entsprechen).
Methode zum Aufrufen von myisamchk:
Shell> myisamchk [Optionen] Tabellenname ...
Optionen gibt an, was myisamchk tun soll. Sie werden später beschrieben. Sie können eine Liste der Optionen auch erhalten, indem Sie myisamchk --help aufrufen.
Tabellenname ist die Datenbanktabelle, die Sie überprüfen oder reparieren möchten. Wenn Sie myisamchk nicht irgendwo im Datenbankverzeichnis ausführen, müssen Sie den Pfad zum Datenbankverzeichnis angeben, da myisamchk nicht weiß, wo sich Ihre Datenbank befindet. Tatsächlich ist es myisamchk egal, ob sich die Datei, die Sie bearbeiten, in einem Datenbankverzeichnis befindet. Sie können die der Datenbanktabelle entsprechende Datei an eine andere Stelle kopieren und dort den Wiederherstellungsvorgang durchführen.
Wenn Sie möchten, können Sie über die myisamchk-Befehlszeile mehrere Tabellen benennen. Sie können eine Tabelle auch angeben, indem Sie die Indexdatei benennen (mit dem Suffix „.MYI“). Es ermöglicht Ihnen, alle Tabellen in einem Verzeichnis mithilfe des Schemas „*.MYI“ anzugeben. Wenn Sie sich beispielsweise im Datenbankverzeichnis befinden, können Sie alle MyISAM-Tabellen im Verzeichnis wie folgt überprüfen:
Shell> myisamchk *.MYI
Wenn Sie sich nicht im Datenbankverzeichnis befinden, können Sie alle Tabellen dort überprüfen, indem Sie den Pfad zum Verzeichnis angeben:
Shell> myisamchk /path/to/database_dir/*.MYI
Sie können sogar alle Tabellen in allen Datenbanken überprüfen, indem Sie einen Platzhalter für den Pfad zum MySQL-Datenverzeichnis angeben:
Shell> myisamchk /path/to/datadir/*/*.MYI
Der empfohlene Weg, alle MyISAM-Tabellen schnell zu überprüfen, ist:
Shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
Wenn Sie alle MyISAM-Tabellen überprüfen und alle beschädigten Tabellen reparieren möchten, können Sie den folgenden Befehl verwenden:
Shell> myisamchk --silent --force --fast --update-state
-O key_buffer=64M -O sort_buffer=64M
-O read_buffer=1M -O write_buffer=1M
/path/to/datadir/*/*.MYI
Bei diesem Befehl wird davon ausgegangen, dass Sie über mehr als 64 MB freien Speicher verfügen. Einzelheiten zum Zuweisen von Speicher mit myisamchk finden Sie in Abschnitt 5.9.5.5, „myisamchk-Speichernutzung“.
Wenn Sie myisamchk ausführen, müssen Sie sicherstellen, dass andere Programme die Tabelle nicht verwenden. Andernfalls wird beim Ausführen von myisamchk die folgende Fehlermeldung angezeigt:
Warnung: Clients verwenden die Tabelle oder haben sie nicht ordnungsgemäß geschlossen
Dies weist darauf hin, dass Sie versuchen, eine Tabelle zu überprüfen, die von einem anderen Programm (z. B. dem MySQL-Server) aktualisiert wird, das die Datei nicht geschlossen hat oder beendet wurde, ohne die Datei ordnungsgemäß zu schließen.
Wenn mysqld ausgeführt wird, müssen Sie über FLUSH TABLES das Löschen aller noch im Speicher befindlichen Tabellenänderungen erzwingen. Wenn Sie myisamchk ausführen, müssen Sie sicherstellen, dass andere Programme die Tabelle nicht verwenden. Der einfachste Weg, das Problem zu vermeiden, besteht darin, die Tabelle mit CHECK TABLE anstelle von myisamchk zu überprüfen.