Reparar todas as mesas de uma só vez
em vez de escrever a consulta {[[0]} para todas as tabelas, uma a uma.
Há algum comando simples comocheck all
ou algo assim?
8 answers
A partir da linha de comandos pode usar:
mysqlcheck -A --auto-repair
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
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
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.
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
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
mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
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