it-swarm.com.de

Warum stürzen MySQL-Tabellen ab? Wie verhindere ich das?

Ich bin der Administrator einer Moodle Site, deren Benutzertabelle beschädigt war und unbrauchbar wurde.

Zum Glück ein einfaches REPAIR TABLE mdl_user hat es wieder funktionieren lassen. Die Sache ist, dass ich nicht weiß, warum es tatsächlich abgestürzt ist und es unbrauchbar gemacht hat, und ich möchte sicherstellen, dass ich beim nächsten Mal besser vorbereitet bin.

Ich bin kein durch und durch erfahrener DBA - ich bin nur ein Entwickler, der eine Menge Sachen macht, also bitte nehmen Sie mit mir Kontakt auf.

Ich könnte einfach ein Backup wiederherstellen, aber ich denke, es gibt Möglichkeiten, Abstürze zu verhindern.

Diese Tabellen sind utf8_general_ci und verwenden MyISAM.

Warum stürzt eine MySQL-Tabelle ab? Was kann ich tun, um dies zu verhindern?

9
AeroCross

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 ein einfacher REPAIR TABLE mdl_user Jedes Mal ohne Datenverlust wieder funktioniert, kann dies darauf hinweisen, dass Sie eine stark frequentierte Site haben, die in mdl_user Schreibt.

Wenn Dutzende von Tabellen dies erfordern REPAIR TABLE, Würde ich alle Tabellen in InnoDB konvertieren. Wenn jedoch die Tabelle mdl_user Die einzige Tabelle mit diesem Problem ist, können Sie Folgendes tun (in diesem Beispiel lautet 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 Ihr Problem, wenn Sie MyISAM verwenden, wenn Ihnen der Speicherplatz ausgeht?

Folgendes ist zu beachten: Laut MySQL 5.0 Certification Study Guide ,

enter image description here

Aufzählungspunkt Nr. 11 sagt 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.

11
RolandoMySQLDBA

Ich verwalte auch eine Moodle-Site auf MySQL, und die häufigste Ursache für Tabellenkorruption ist, dass uns der Speicherplatz ausgeht.

0
Kevin