Antworten:
Über die Befehlszeile können Sie Folgendes verwenden:
mysqlcheck -A --auto-repair
Der Befehl lautet:
mysqlcheck -u root -p --auto-repair --check --all-databases
Sie müssen das Passwort angeben, wenn Sie dazu aufgefordert werden.
oder Sie können dieses ausführen, es wird jedoch nicht empfohlen, da das Kennwort im Klartext geschrieben ist:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Verwenden Sie die folgende Abfrage, um REPAIR
SQL-Anweisungen für alle Tabellen in einer Datenbank zu drucken :
select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
Danach kopieren Sie alle Abfragen und führen sie aus mydatabase
.
Hinweis: Durch den mydatabase
gewünschten DB-Namen ersetzen
Sie müssen das Passwort nicht eingeben, verwenden Sie einfach einen der folgenden Befehle (selbsterklärend):
mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
Der folgende Befehl funktionierte für mich über die Eingabeaufforderung (als Administrator) in Windows:
mysqlcheck -u root -p -A --auto-repair
Führen Sie mysqlcheck mit dem Root-Benutzer aus, geben Sie ein Kennwort ein, überprüfen Sie alle Datenbanken und reparieren Sie beschädigte Tabellen automatisch.
Es gibt keinen Standardbefehl, um dies zu tun, aber Sie können eine Prozedur erstellen, um den Job auszuführen. Es wird durch Zeilen von durchlaufen information_schema
und REPAIR TABLE 'tablename';
für jede Zeile aufrufen . CHECK TABLE
wird für vorbereitete Anweisungen noch nicht unterstützt. Hier ist das Beispiel (ersetzen Sie MYDATABASE durch Ihren Datenbanknamen):
CREATE DEFINER = 'root'@'localhost'
PROCEDURE MYDATABASE.repair_all()
BEGIN
DECLARE endloop INT DEFAULT 0;
DECLARE tableName char(100);
DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`=DATABASE();
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop=1;
OPEN rCursor;
FETCH rCursor INTO tableName;
WHILE endloop = 0 DO
SET @sql = CONCAT("REPAIR TABLE `", tableName, "`");
PREPARE statement FROM @sql;
EXECUTE statement;
FETCH rCursor INTO tableName;
END WHILE;
CLOSE rCursor;
END
Ich mag dies für eine einfache Überprüfung von der Shell:
mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
mysql -ss
, um Spaltennamen aus der Ausgabe wegzulassen - dies würde es ermöglichen, NR != 1
aus Ihrem Code zu entfernen
Möglicherweise benötigen Sie Benutzername und Passwort:
mysqlcheck -A --auto-repair -uroot -p
Sie werden zur Eingabe des Passworts aufgefordert.
mysqlcheck -A --auto-repair -uroot -p{{password here}}
Wenn Sie cron eingeben möchten, ABER Ihr Passwort wird im Klartext angezeigt!
Wenn beschädigte Tabellen nach bleiben
mysqlcheck -A --auto-repair
Versuchen
mysqlcheck -A --auto-repair --use-frm