Как проверить все таблицы в базе данных за один раз?
Вместо того, чтобы вводить запрос check table ''tablename'';
для всех таблиц один за другим.
Есть ли какая-нибудь простая команда вроде check all
или что-то в этом роде?
Как проверить все таблицы в базе данных за один раз?
Вместо того, чтобы вводить запрос check table ''tablename'';
для всех таблиц один за другим.
Есть ли какая-нибудь простая команда вроде check all
или что-то в этом роде?
из командной строки, которую вы можете использовать:
mysqlcheck -A --auto-repair
Команда такова:
mysqlcheck -u root -p --auto-repair --check --all-databases
Вы должны указать пароль при запросе,
или вы можете запустить этот, но не рекомендуется, потому что пароль написан в виде чистого текста:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
select concat('repair table ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
Для "mydatabase" используйте ваше имя базы данных.
Следующая команда работала для меня с помощью командной строки (как администратора) в 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>