Respostas:
na linha de comando, você pode usar:
mysqlcheck -A --auto-repair
O comando é este:
mysqlcheck -u root -p --auto-repair --check --all-databases
Você deve fornecer a senha quando solicitado,
ou você pode executar este, mas não é recomendado porque a senha é escrita em texto simples:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Use a seguinte consulta para imprimir as REPAIRinstruções SQL para todas as tabelas dentro de um banco de dados:
select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
Depois disso, copie todas as consultas e execute-as no mydatabase .
Nota: substitua mydatabasepelo nome do banco de dados desejado
Não há necessidade de digitar a senha, basta usar qualquer um destes comandos (autoexplicativo):
mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
O seguinte comando funcionou para mim usando o prompt de comando (como administrador) no Windows:
mysqlcheck -u root -p -A --auto-repair
Execute mysqlcheck com o usuário root, solicite uma senha, verifique todos os bancos de dados e repare automaticamente quaisquer tabelas corrompidas.
Não existe um comando padrão para fazer isso, mas você pode criar um procedimento para fazer o trabalho. Ele irá iterar por meio de linhas de information_schemae chamar REPAIR TABLE 'tablename';cada linha. CHECK TABLEainda não tem suporte para declarações preparadas. Aqui está o exemplo (substitua MYDATABASE pelo nome do seu banco de dados):
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
Eu gosto disso para uma verificação simples do 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 -sspara omitir os nomes das colunas da saída - isso permitiria remover NR != 1do seu código
Você pode precisar de nome de usuário e senha:
mysqlcheck -A --auto-repair -uroot -p
Será solicitada a senha.
mysqlcheck -A --auto-repair -uroot -p{{password here}}
Se você quiser colocar no cron, MAS sua senha ficará visível em texto simples!
Se as tabelas corrompidas permanecerem após
mysqlcheck -A --auto-repair
experimentar
mysqlcheck -A --auto-repair --use-frm