Відремонтуйте всі таблиці за один раз


112

Як перевірити всі таблиці в базі даних за один раз?

Замість того, щоб вводити запит check table ''tablename'';для всіх таблиць одна за одною.

Чи є якась така проста команда check allчи щось подібне?

Відповіді:



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 --оптимізувати --all-бази даних Помилка: mysqlcheck не підтримує декілька суперечливих команд
Alekc

11
Якщо ви отримаєте суперечливу помилку команд, вийміть опцію --optimize.
Саркастрон

Я думаю, вам доведеться використовувати один і лише один із цих варіантів: автоматичний ремонт, перевірка чи оптимізація. Я використовував лише авторемонт і працював
Packet Tracer

Я спробував те, що ви сказали, але я отримую: mysqlcheck: Отримала помилку: 1045: При спробі підключення доступу користувач 'root' @ 'localhost' (використовуючи пароль: ТАК) відхилений доступ, і я знаю, що використовую правильний пароль.
Дуг

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>

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

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

--use-frm Для операцій з ремонту таблиць MyISAM знайдіть структуру таблиці зі словника даних, щоб таблицю можна було відновити, навіть якщо заголовок .MYI пошкоджений. (пор. dev.mysql.com/doc/refman/8.0/en/… )
Laloi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.