当MYI文件损坏或丢失时,如何从MySQL命令提示符修复所有数据库中的所有表?

Dre*_*rew 11 mysql

处理MySQL数据库损坏时,如果MYI索引文件丢失或其标头已损坏,则无法使用myisamchk命令:

myisamchk --safe-recover --force --sort_buffer_size=2G --key_buffer_size=2G /var/lib/mysql/*/*.MYI
Run Code Online (Sandbox Code Playgroud)

您必须使用use_frm选项从MySQL命令提示符进行修复:

repair tbl_name use_frm;
Run Code Online (Sandbox Code Playgroud)

根据MySQL文档修复表

如果.MYI索引文件丢失或其标头已损坏,则可以使用USE_FRM选项.此选项告诉MySQL不要信任.MYI文件头中的信息,并使用.frm文件中的信息重新创建它.使用myisamchk无法进行此类修复.

使用myisamchk,您可以轻松地放入每个数据库文件夹并使用命令末尾的星号修复每个表:

/var/lib/mysql/*/*.MYI
Run Code Online (Sandbox Code Playgroud)

你不能从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
Run Code Online (Sandbox Code Playgroud)

是否可以修改这样的过程来遍历所有MySQL数据库并修复这些数据库中的每个表?

我认为这对于拥有大量数据库并遇到严重损坏的人来说非常有用.

Joh*_*ess 16

mysqlcheck是一种更方便的命令行界面到MySQL CHECK,REPAIR,ANALYZEOPTIMIZE语句.

mysqlcheck --repair --use-frm --all-databases
Run Code Online (Sandbox Code Playgroud)