|
当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数据库并修复这些数据库中的每个表吗?
我认为这对任何拥有大量数据库并遇到严重腐败的人都是有用的。
|
|