При работе с повреждением базы данных MySQL, если отсутствует индексный файл MYI или поврежден его заголовок, вы не можете использовать команду myisamchk:
myisamchk --safe-recover --force --sort_buffer_size=2G --key_buffer_size=2G /var/lib/mysql/*/*.MYI
Вы должны выполнить ремонт из командной строки MySQL с помощью опции use_frm:
repair tbl_name use_frm;
Per Документация MySQL по ремонту таблиц
Опция USE_FRM доступна для использования, если отсутствует индексный файл .MYI или поврежден его заголовок. Этот параметр говорит MySQL не доверять информации в заголовке файла .MYI и воссоздавать его с использованием информации из файла .frm. Этот вид ремонта не может быть выполнен с помощью myisamchk.
С помощью myisamchk вы можете легко попасть в каждую папку базы данных и восстановить каждую таблицу с помощью звездочек в конце команды:
/var/lib/mysql/*/*.MYI
Вы не можете сделать ничего подобного из командной строки MySQL.
Есть вопрос StackOverflow с ответом, в котором объясняется как восстановить все таблицы в одной конкретной базе данных из командной строки MySQL с помощью процедуры:
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 и восстановления каждой таблицы в этих базах данных?
Я думаю, что это может быть полезно для всех, кто имеет большое количество баз данных и сталкивается с серьезной коррупцией.