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

112

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

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

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

AMD
источник

Ответы:

108

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

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

Вы должны указать пароль, когда вас спросят,

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

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Константин Гальбену
источник
7
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases Ошибка: mysqlcheck не поддерживает несколько противоречащих друг другу команд
Alekc 05
11
Если вы получаете сообщение об ошибке противоречащих команд, отключите параметр --optimize.
Sarcastron 06
Я думаю, вам нужно использовать один и только один из этих вариантов: автоматическое восстановление, проверка или оптимизация. Я использовал только авторемонт и работал
Packet Tracer
Я пробовал то, что вы сказали, но получаю: mysqlcheck: Получил ошибку: 1045: Отказано в доступе для пользователя root '@' localhost '(с использованием пароля: YES) при попытке подключения, и я знаю, что использую правильный пароль.
Дуг
24

Используйте следующий запрос, чтобы распечатать REPAIRстатистику SQL для всех таблиц в базе данных:

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

После этого скопируйте все запросы и выполните его mydatabase.

Примечание: замените mydatabaseжелаемым именем БД

СентилКумар
источник
9

Не нужно вводить пароль, просто используйте любую из этих команд (не требует пояснений):

mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
Сумасшедший серб
источник
8

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

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

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

контакты
источник
3

Для этого нет команды по умолчанию, но вы можете создать процедуру для выполнения этой работы. Он будет перебирать строки 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
Санкт-Воланд
источник
1

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

mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
Jerrygarciuh
источник
1
вы можете использовать mysql -ssдля исключения имен столбцов из вывода - это позволит удалить их NR != 1из вашего кода
Fluffy
1

для хостов plesk один из них должен делать: (оба делают то же самое)

mysqlrepair -uadmin -p$(cat /etc/psa/.psa.shadow) -A
# or
mysqlcheck -uadmin -p$(cat /etc/psa/.psa.shadow) --repair -A
sjas
источник
1

Вам могут понадобиться имя пользователя и пароль:

mysqlcheck -A --auto-repair -uroot -p

Вам будет предложено ввести пароль.

mysqlcheck -A --auto-repair -uroot -p{{password here}}

Если вы хотите поставить cron, НО ваш пароль будет виден в виде обычного текста!

Майк Зриэль
источник
1

Если поврежденные таблицы остаются после

mysqlcheck -A --auto-repair

пытаться

mysqlcheck -A --auto-repair --use-frm
Лалои
источник
что делает -use-frm?
davidman77 02
--use-frm Для операций восстановления таблиц MyISAM получить структуру таблицы из словаря данных, чтобы можно было восстановить таблицу, даже если заголовок .MYI поврежден. (см. dev.mysql.com/doc/refman/8.0/en/… )
Лалои