Reparar todas as mesas de uma só vez

Como verificar todas as tabelas da base de dados de uma só vez?

em vez de escrever a consulta {[[0]} para todas as tabelas, uma a uma.

Há algum comando simples como check all ou algo assim?

 96
Author: guaka, 2011-01-03

8 answers

A partir da linha de comandos pode usar:

mysqlcheck -A --auto-repair

Http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html

 136
Author: Gu1234, 2011-01-03 08:50:09

O comando é este:

mysqlcheck -u root -p --auto-repair --check --all-databases

Você deve fornecer a senha quando perguntado,

Ou você pode executar este, mas não é recomendado porque a senha está escrita em texto claro:

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
 89
Author: Constantin Galbenu, 2015-06-06 22:10:07

Usar a seguinte pesquisa para imprimir REPAIR Estatísticas SQL para todas as tabelas dentro de uma base 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 em {[[2]}.

Nota: substituir mydatabase pelo nome de DB desejado

 16
Author: SenthilKumar, 2018-05-21 05:39:44

O seguinte comando funcionou para mim usando a linha de comandos (como administrador) no Windows:

mysqlcheck -u root -p -A --auto-repair

Execute o mysqlcheck com o utilizador root, peça uma senha, verifique todas as bases de dados e repare automaticamente todas as tabelas corrompidas.

 8
Author: contactmatt, 2016-04-08 20:04:06

Não é necessário escrever a senha, basta usar qualquer um destes comandos (auto-explicativo):

mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
 4
Author: Crazy Serb, 2018-03-14 08:50:47

Não há nenhum comando padrão para fazer isso, mas você pode criar um procedimento para fazer o trabalho. Iterará através de linhas de information_schema e chamará REPAIR TABLE 'tablename'; por cada linha. CHECK TABLE ainda não é suportado para declarações preparadas. Aqui está o exemplo (substitua o MYDATABASE pelo nome da sua base 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
 3
Author: St.Woland, 2011-01-03 08:30:51
Eu gosto disto para um simples cheque da shell:
mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
 1
Author: jerrygarciuh, 2014-11-05 02:40:45

Para os anfitriões de plesk, um destes deve fazer: (ambos fazem o mesmo)

mysqlrepair -uadmin -p$(cat /etc/psa/.psa.shadow) -A
# or
mysqlcheck -uadmin -p$(cat /etc/psa/.psa.shadow) --repair -A
 0
Author: sjas, 2018-04-27 07:53:57