Как вы можете восстановить все таблицы во всех базах данных из командной строки MySQL, когда файл MYI поврежден или отсутствует?

При работе с повреждением базы данных 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 и восстановления каждой таблицы в этих базах данных?

Я думаю, что это может быть полезно для всех, кто имеет большое количество баз данных и сталкивается с серьезной коррупцией.

Ответ 1

mysqlcheck - более удобный интерфейс командной строки для MySQL CHECK, REPAIR, ANALYZE и OPTIMIZE.

mysqlcheck --repair --use-frm --all-databases

Ответ 2

Здесь мое решение, когда мне пришлось исправить все файлы MyISAM в моей базе данных:

find ./ -name "*.MYI" -exec myisamchk -r {} \;

Он перемещает все базы данных.