Risposte:
dalla riga di comando puoi usare:
mysqlcheck -A --auto-repair
Il comando è questo:
mysqlcheck -u root -p --auto-repair --check --all-databases
È necessario fornire la password quando richiesto,
oppure puoi eseguire questo ma non è consigliato perché la password è scritta in chiaro:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Utilizzare la seguente query per stampare REPAIR
le istruzioni SQL per tutte le tabelle all'interno di un database:
select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
Dopodiché copia tutte le query ed eseguilo mydatabase
.
Nota: sostituire mydatabase
con il nome DB desiderato
Non è necessario digitare la password, basta utilizzare uno qualsiasi di questi comandi (autoesplicativo):
mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
Il seguente comando ha funzionato per me utilizzando il prompt dei comandi (come amministratore) in Windows:
mysqlcheck -u root -p -A --auto-repair
Esegui mysqlcheck con l'utente root, richiedi una password, controlla tutti i database e ripara automaticamente le tabelle danneggiate.
Non esiste un comando predefinito per farlo, ma puoi creare una procedura per eseguire il lavoro. Itererà attraverso le righe di information_schema
e chiamerà REPAIR TABLE 'tablename';
per ogni riga. CHECK TABLE
non è ancora supportato per le dichiarazioni preparate. Ecco l'esempio (sostituisci MYDATABASE con il nome del tuo database):
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
Mi piace questo per un semplice controllo dalla 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
per omettere i nomi delle colonne dall'output - questo consentirebbe di rimuovere NR != 1
dal tuo codice
Potresti aver bisogno di nome utente e password:
mysqlcheck -A --auto-repair -uroot -p
Ti verrà richiesta la password.
mysqlcheck -A --auto-repair -uroot -p{{password here}}
Se vuoi mettere cron, MA la tua password sarà visibile in testo normale!
Se le tabelle danneggiate rimangono dopo
mysqlcheck -A --auto-repair
provare
mysqlcheck -A --auto-repair --use-frm