Відповіді:
з командного рядка ви можете використовувати:
mysqlcheck -A --auto-repair
Команда така:
mysqlcheck -u root -p --auto-repair --check --all-databases
Ви повинні надати пароль, коли запитаєте,
або ви можете запустити цей, але це не рекомендується, оскільки пароль написаний чітким текстом:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Використовуйте наступний запит для друку REPAIR
статей SQL для всіх таблиць всередині бази даних:
select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
Після цього скопіюйте всі запити та виконайте їх mydatabase
.
Примітка: замініть mydatabase
потрібне ім'я БД
Не потрібно вводити пароль, просто скористайтеся будь-якою з цих команд (сама пояснення):
mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
Наступна команда працювала для мене, використовуючи командний рядок (як адміністратор) у Windows:
mysqlcheck -u root -p -A --auto-repair
Запустіть mysqlcheck з користувачем root, запитайте про пароль, перевірте всі бази даних та автоматично відновіть пошкоджені таблиці.
Для цього немає команди за замовчуванням, але ви можете створити процедуру для виконання завдання. Він повторюватиметься через рядки 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
Мені це подобається для простої перевірки з оболонки:
mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
mysql -ss
щоб імена стовпців були пропущені з виводу - це дозволило б видалити NR != 1
зі свого коду
Можливо, вам знадобляться ім’я користувача та пароль:
mysqlcheck -A --auto-repair -uroot -p
Вам буде запропоновано ввести пароль.
mysqlcheck -A --auto-repair -uroot -p{{password here}}
Якщо ви хочете поставити в cron, АЛЕ ваш пароль буде видно у простому тексті!
Якщо пошкоджені таблиці залишаються після
mysqlcheck -A --auto-repair
спробуйте
mysqlcheck -A --auto-repair --use-frm