Ремонт всех столов за один раз

Как проверить все таблицы в базе данных за один раз?

Вместо того, чтобы вводить запрос check table ''tablename''; для всех таблиц один за другим.

Есть ли какая-нибудь простая команда вроде check all или что-то в этом роде?

Ответ 2

Команда такова:

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

Вы должны указать пароль при запросе,

или вы можете запустить этот, но не рекомендуется, потому что пароль написан в виде чистого текста:

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases

Ответ 3

select concat('repair table ', table_name, ';') from information_schema.tables 
where table_schema='mydatabase';

Для "mydatabase" используйте ваше имя базы данных.

Ответ 4

Следующая команда работала для меня с помощью командной строки (как администратора) в Windows:

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

Запустите mysqlcheck с пользователем root, запросите пароль, проверьте все базы данных и автоматически восстановите поврежденные таблицы.

Ответ 5

Для этого нет команды по умолчанию, но вы можете создать процедуру для выполнения задания. Он будет перебирать строки из information_schema и вызывать REPAIR TABLE 'tablename'; для каждой строки. CHECK TABLE пока не поддерживается для подготовленных операторов. Вот пример (замените MYDATABASE своим именем базы данных):

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

Ответ 6

Мне это нравится для простой проверки из оболочки:

mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>