In diesem Abschnitt wird beschrieben, wie man
myisamchk für
MyISAM
-Tabellen (Erweiterungen
.MYI
und .MYD
)
verwendet.
Sie können (und sollten möglichst auch)
MyISAM
-Tabellen mit CHECK
TABLE
- und REPAIR
TABLE
-Anweisungen überprüfen bzw. reparieren.
Siehe auch Abschnitt 13.5.2.3, „CHECK TABLE
“, und
Abschnitt 13.5.2.6, „REPAIR TABLE
“.
Zu den Symptomen beschädigter Tabellen gehören auch Abfragen, die unerwartet abgebrochen werden, und wahrnehmbare Fehler wie die folgenden:
ist gegen Änderungen gesperrt
tbl_name
.frm
Die Datei
kann nicht gefunden werden (Fehlercode:
tbl_name
.MYInnn
)
Unerwartetes Ende der Datei
Aufzeichnungsdatei ist abgestürzt
Fehler nnn
vom Tabellen-Handler
erhalten
Um weitere Informationen zum Fehler zu erhalten, führen Sie
perror nnn
aus,
wobei nnn
die Fehlernummer ist. Die
folgenden Beispiele zeigen, wie man mit
perror die Bedeutungen der häufigsten
Fehlernummern ermittelt, die ein Problem mit einer Tabelle
angeben:
shell> perror 126 127 132 134 135 136 141 144 145
126 = Index file is crashed / Wrong file format
127 = Record-file is crashed
132 = Old database file
134 = Record was already deleted (or record file crashed)
135 = No more room in record file
136 = No more room in index file
141 = Duplicate unique key or constraint on write or update
144 = Table is crashed and last repair failed
145 = Table was marked as crashed and should be repaired
Beachten Sie, dass die Fehler 135 („No more room in
record file“) und 136 („No more room in index
file“) nicht mit einer einfachen Tabellenreparatur
behoben werden können. In diesem Fall müssen Sie mit
ALTER TABLE
die Tabellenoptionswerte
MAX_ROWS
und
AVG_ROW_LENGTH
erhöhen:
ALTER TABLEtbl_name
MAX_ROWS=xxx
AVG_ROW_LENGTH=yyy
;
Wenn Sie die aktuellen Tabellenoptionswerte nicht kennen,
verwenden Sie SHOW CREATE TABLE
.
Bei Auftreten anderer Fehler müssen Sie Ihre Tabellen reparieren. myisamchk erkennt und behebt normalerweise die meisten Probleme.
Der Reparaturvorgang umfasst die nachfolgend beschriebenen vier Stufen. Bevor Sie anfangen, sollten Sie in das Datenbankverzeichnis wechseln und die Berechtigungen für die Tabellendateien überprüfen. Unter Unix müssen Sie sicherstellen, dass diese von dem Benutzer gelesen werden können, als der mysqld ausgeführt wird (und von Ihnen natürlich auch, denn schließlich müssen Sie auf die Dateien zugreifen können, die Sie überprüfen wollen). Sollte sich herausstellen, dass Sie Dateien ändern müssen, dann sollten diese auch von Ihnen geschrieben werden können.
Dieser Abschnitt ist für Fälle vorgesehen, in denen die Überprüfung einer Tabelle fehlschlägt (siehe auch die Beschreibung in Abschnitt 5.10.4.2, „Wie Tabellen auf Fehler überprüft werden“) oder Sie die erweiterten Funktionen einsetzen wollen, die myisamchk bereitstellt.
Die Optionen, die Sie zur Wartung von Tabellen mit myisamchk verwenden können, sind in Abschnitt 8.2, „myisamchk — Hilfsprogramm für die Tabellenwartung von MyISAM“, beschrieben.
Wenn Sie eine Tabelle über die Befehlszeile reparieren wollen, müssen Sie den Server mysqld zunächst beenden. Beachten Sie, dass, wenn Sie mysqladmin shutdown auf einem entfernten Server ausführen, der Server mysqld auch nach der entsprechenden Meldung von mysqladmin noch eine Weile weiterläuft, bis die gesamte Anweisungsbearbeitung beendet wurde und alle Änderungen auf Festplatte geschrieben wurden.
Stufe 1: Tabellen überprüfen
Führen Sie myisamchk *.MYI oder – wenn
genug Zeit vorhanden ist – myisamchk -e
*.MYI aus. Verwenden Sie die Option
-s
(stumm) zur Unterdrückung nicht
benötigter Informationen.
Wenn der Server mysqld beendet ist, sollten
Sie die Option --update-state
verwenden, um
myisamchk anzuweisen, die Tabelle als
„geprüft“ zu kennzeichnen.
Sie müssen nur diejenigen Tabellen reparieren, für die myisamchk einen Fehler meldet. Fahren Sie bei solchen Tabellen mit Stufe 2 fort.
Erhalten Sie bei der Überprüfung unerwartete Fehler (z. B.
out of memory
) oder stürzt
myisamchk ab, dann fahren Sie mit Stufe 3
fort.
Stufe 2: Einfache und sichere Reparatur
Probieren Sie zunächst myisamchk -r -q
tbl_name
aus (-r
-q
bedeutet „schneller
Wiederherstellungsmodus“). Hierbei wird versucht, die
Indexdatei zu reparieren, ohne die Datendatei anzurühren.
Wenn die Datendatei alles Erforderliche enthält und die
Löschverknüpfungen auf die korrekten Positionen innerhalb
der Datendatei verweisen, sollte diese Vorgehensweise
funktionieren, d. h. die Tabelle sollte nachfolgend repariert
sein. Fahren Sie nun mit der Reparatur der nächsten Tabelle
fort. Andernfalls wenden Sie folgende Vorgehensweise an:
Erstellen Sie ein Backup der Datendatei, bevor Sie fortfahren.
Verwenden Sie myisamchk -r
tbl_name
(-r
bedeutet
„Wiederherstellungsmodus“). Hierdurch werden
falsche und gelöschte Datensätze aus der Datendatei
entfernt, und die Indexdatei wird neu erstellt.
Schlägt der vorherige Schritt fehl, dann setzen Sie
myisamchk --safe-recover
tbl_name
ab. Der
sichere Wiederherstellungsmodus verwendet eine alte
Wiederherstellungsmethode, die ein paar Fälle behebt, die
im normalen Wiederherstellungsmodus unberücksichtigt
bleiben; sie ist aber langsamer.
Hinweis: Wenn Sie eine Reparaturoption erheblich beschleunigen
wollen, sollten Sie die Werte der Variablen
sort_buffer_size
und
key_buffer_size
jeweils auf 25 Prozent
Ihres verfügbaren Speichers setzen, wenn Sie
myisamchk ausführen.
Erhalten Sie bei der Reparatur unerwartete Fehler (z. B.
out of memory
) oder stürzt
myisamchk ab, dann fahren Sie mit Stufe 3
fort.
Stufe 3: Schwierige Reparatur
Diese Stufe sollten Sie nur erreichen, wenn der erste 16-Kbyte-Block der Indexdatei zerstört ist oder falsche Daten enthält oder aber die Indexdatei ganz fehlt. In diesem Fall muss eine neue Indexdatei erstellt werden. Gehen Sie wie folgt vor:
Verschieben Sie die Datendatei an einen sicheren Ort.
Erstellen Sie unter Verwendung der Tabellenbeschreibungsdatei neue (leere) Daten- und Indexdateien:
shell>mysql
mysql>db_name
SET AUTOCOMMIT=1;
mysql>TRUNCATE TABLE
mysql>tbl_name
;quit
Kopieren Sie die alte Datendatei wieder auf die neu erstellte Datendatei. (Verschieben Sie die alte Datei nicht einfach auf die neue, sondern behalten Sie eine Kopie für den Fall, dass etwas fehlschlägt.)
Kehren Sie zurück zu Stufe 2. myisamchk -r -q sollte nun funktionieren. (Das heißt, die Stufen sollten sich nicht in endloser Abfolge wiederholen.)
Sie können auch die SQL-Anweisung REPAIR TABLE
verwenden, die den gesamten Vorgang automatisch ausführt. Es
gibt außerdem nicht die Möglichkeit unerwünschter
Interaktion zwischen einem Hilfsprogramm und dem Server, weil
der Server gar nicht läuft, wenn Sie tbl_name
USE_FRMREPAIR
TABLE
verwenden. Siehe auch
Abschnitt 13.5.2.6, „REPAIR TABLE
“.
Stufe 4: Sehr schwierige Reparatur
Diese Stufe sollten Sie nur erreichen, wenn die
.frm
-Beschreibungsdatei ebenfalls
abgestürzt ist. Dies sollte eigentlich nie passieren, da die
Beschreibungsdatei nach Erstellung der Tabelle nicht mehr
geändert wird:
Stellen Sie die Beschreibungsdatei aus einer Sicherungskopie wieder her und kehren Sie zu Stufe 3 zurück. Sie können auch die Indexdatei wiederherstellen und dann bei Stufe 2 fortfahren; in diesem Fall sollten Sie allerdings mit myisamchk -r beginnen.
Wenn Sie über keine Sicherungskopie verfügen, aber genau
wissen, wie die Tabelle erstellt worden war, erstellen Sie
eine Kopie der Tabelle in einer andere Datenbank.
Entfernen Sie die neue Datendatei und verschieben Sie die
.frm
-Beschreibungsdatei und die
.MYI
-Indexdatei aus der anderen
Datenbank in die abgestürzte Datenbank. Auf diese Weise
erhalten Sie eine neue Beschreibungs- und Indexdatei,
während die .MYD
-Datendatei nicht
angerührt wird. Kehren Sie zu Stufe 2 zurück und
versuchen Sie, die Indexdatei neu zu erstellen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.