Es ist ziemlich leicht, dass eine MyISAM-Tabelle abstürzt.
In der Kopfzeile jeder MyISAM-Tabelle befindet sich ein Zähler, der verfolgt, wie viele offene Dateihandles für die Tabelle vorhanden sind.
Wenn Sie mysql starten und die Nummer im Header nicht mit der Anzahl der tatsächlichen Dateihandles übereinstimmt, behandelt mysqld die Tabelle als abgestürzt.
Wenn eine einfache Funktion REPAIR TABLE mdl_user
jedes Mal ohne Datenverlust wieder funktioniert, kann dies darauf hinweisen, dass Sie über eine Website mit sehr hohem Datenverkehr verfügen, auf die geschrieben wird mdl_user
.
Wenn Dutzende von Tabellen dies erfordern REPAIR TABLE
, würde ich alle Tabellen in InnoDB konvertieren. Wenn die mdl_user
Tabelle jedoch die einzige Tabelle mit diesem Problem ist, können Sie Folgendes tun (in diesem Beispiel beispielsweise die Datenbank moodle
).
Wenn Sie möchten, dass alle Tabellen als MyISAM verbleiben
SCHRITT 01: Erstellen Sie ein Reparaturtabellenskript
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
SCHRITT 02: Deklarieren Sie das Reparaturskript als Startdatei
Fügen Sie dies zu /etc/my.cnf hinzu
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
SCHRITT 03: Starten Sie MySQL neu
Jeder Neustart von MySQL löst das Repair Table Script aus
Wenn Sie möchten, dass alle Tabellen zu InnoDB werden
Führen Sie diesen Code aus, um ein Massenkonvertierungsskript von MyISAM-Tabellen in InnoDB zu erstellen, und zeigen Sie es an
MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql
Wenn Sie mit dem Inhalt des Konvertierungsskripts zufrieden sind, führen Sie es aus
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
UPDATE 2012-03-15 14:00 EDT
@ Kevin , was ist, wenn Sie MyISAM verwenden, wenn Ihnen der Speicherplatz ausgeht?
Folgendes ist zu beachten: Laut MySQL 5.0 Certification Study Guide ,
Aufzählungspunkt Nr. 11 besagt Folgendes auf den Seiten 408.409, Abschnitt 29.2:
Wenn Ihnen beim Hinzufügen von Zeilen zu einer MyISAM-Tabelle nicht genügend Speicherplatz zur Verfügung steht, tritt kein Fehler auf. Der Server unterbricht den Vorgang, bis Speicherplatz verfügbar ist, und schließt den Vorgang dann ab.
Wenn Ihnen der Speicherplatz ausgeht, fahren Sie mysql nicht einfach herunter oder beenden Sie es. Die Anzahl der geöffneten Dateihandles in einem derzeit verwendeten MyISAM wurde nicht gelöscht. Daher ist die MyISAM-Tabelle als abgestürzt markiert. Wenn Sie Speicherplatz im Datenvolumen freigeben können, während mysqld noch ausgeführt wird, wird mysqld aktiviert, sobald Speicherplatz verfügbar ist.
Ich verwalte auch eine Moodle-Site auf MySQL, und die häufigste Ursache für Tabellenkorruption ist, dass uns der Speicherplatz ausgeht.
quelle
Ich habe eine gute Zeile gefunden, um alle Tabellen in InnoDB zu konvertieren:
quelle