请选择 进入手机版 | 继续访问电脑版

银河数字

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 817|回复: 0

当MYI文件损坏或丢失时,如何从MySQL命令提示符修复所有数...

[复制链接]

365

主题

0

回帖

1305

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1305
发表于 2024-6-8 17:14:51 | 显示全部楼层 |阅读模式
当MYI文件损坏或丢失时,如何从MySQL命令提示符修复所有数据库中的所有表?

在处理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数据库并修复这些数据库中的每个表吗?

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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|银河数字

Web Analytics

GMT+8, 2025-4-22 18:03 , Processed in 0.072471 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表