首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当MYI文件损坏或丢失时,如何从MySQL命令提示符修复所有数据库中的所有表?

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

Stack Overflow用户
提问于 2011-08-16 17:04:45
回答 2查看 36.4K关注 0票数 13

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

代码语言:javascript
复制
myisamchk --safe-recover --force --sort_buffer_size=2G --key_buffer_size=2G /var/lib/mysql/*/*.MYI

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

代码语言:javascript
复制
repair tbl_name use_frm;

关于修复表的MySQL文档

如果缺少USE_FRM索引文件或其标头已损坏,则可使用.MYI选项。此选项告诉MySQL不要信任.MYI文件头中的信息,并使用来自.frm文件的信息重新创建该信息。这种修复不能用myisamchk做。

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

代码语言:javascript
复制
/var/lib/mysql/*/*.MYI

您不能从MySQL命令提示符中执行类似的操作。

有一个StackOverflow问题的答案解释了如何使用过程从MySQL命令提示符修复一个特定数据库中的所有表

代码语言:javascript
复制
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数据库并修复这些数据库中的每个表吗?

我认为这对任何拥有大量数据库并遇到严重腐败的人都是有用的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-16 17:30:41

mysqlcheck是MySQL CHECKREPAIRANALYZEOPTIMIZE语句的更方便的命令行接口.

代码语言:javascript
复制
mysqlcheck --repair --use-frm --all-databases
票数 22
EN

Stack Overflow用户

发布于 2017-03-29 17:19:21

以下是我必须修复DB中所有MyISAM文件时的解决方案:

代码语言:javascript
复制
find ./ -name "*.MYI" -exec myisamchk -r {} \;

它横穿所有的数据库。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7082043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档