Ответы:
из командной строки вы можете использовать:
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