资讯

展开

MyISAM表坏了咋整?myisamchk试一手

作者:快盘下载 人气:

MyISAM表坏了咋整?myisamchk试一手

01myisamchk工具简介

myisamchk是mysql安装包内部自带的一个工具,它的作用是检查、修复或者优化MyISAM存储引擎的表。

myisamchk工具,一般放在bin目录下,跟mysqld_safe、mysqld文件放在一起。通常情况下,是在myisam表出现问题的时候,会使用这个工具对出现问题的表进行修复。

一般来讲,一个myisam表,存储上分为三个文件:.frm、.MYD、.MYI其中frm是表结构,MYD是表数据文件,MYI是表索引文件

官方建议:

使用这个工具修复myisam表的时候,最好在进行表修复操作之前对表进行备份;在某些情况下,该操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误

使用方法:

其中,option是相关操作,table_name是表名字,一般修复表的MYI文件就行

使用限制:

1、myisamchk工具不支持分区表。

2、修复表的时候,不能有其他的操作正在使用这张表。例如不能有备份、锁表等操作,因此最好在MySQL关闭的情况下修复表或者利用flush table将这个表内存数据落盘后,锁定表进行修复。否则,如果有其他操作在更新这个表,则会出现下面的报错:

批量修复范例:

MySQL官方给出了一个快速修复所有表的范例:

myisamchk --silent --force --fast --update-state 
   --key_buffer_size=64M 
   --myisam_sort_buffer_size=64M 
   --read_buffer_size=1M --write_buffer_size=1M 
   /path/to/datadir/*/*.MYI

如果有大量剩余内存,可以适当调大上面的内存值。

02实际修复操作

这两天线上出现了一个这样的案例,由于MySQL进程意外挂掉导致的myisam表不可用。报错的信息如下:

             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
                           ...
                   Last_Errno: 144
                   Last_Error: Error 'Table './db/table_1' is marked as crashed and last (automatic?) repair failed' on query.

于是尝试使用这个工具进行修复。修复的时候,发现对应的参数比较多,可以使用myisamchk --help进行查看,这里不一一介绍了。

我这里重点说两个修复方法,通常情况下,有下面两个修复参数:-r,--recover

这个参数可以修复几乎MyISAM存储引擎几乎所有的问题,但是唯一索引值 不唯一 的问题无法处理。-o, --safe-recover

使用旧的恢复方法进行修复,该方法按顺序读取所有行并根据找到的行更新所有索引树。它比--recover 参数慢一个数量级,但可以处理 --recover 不能处理的几个bad case。这种恢复方法使用的磁盘空间也比 --recover 少得多。

通常,我们应该首先使用--recover 进行修复,然后仅在--recover 失败时使用--safe-recover

最后,看一个线上的真实修表的输出吧:

/usr/local/mysql-5.6.24/bin/myisamchk -r table_1.MYI
- recovering (with sort) MyISAM-table 'table_1.MYI'
Data records: 0
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
- Fixing index 5
- Fixing index 6
- Fixing index 7
- Fixing index 8
- Fixing index 9
- Fixing index 10
- Fixing index 11
- Fixing index 12
- Fixing index 13
- Fixing index 14
Data records: 14848225

这个表本身有14个索引,从输出结果看,确实每个索引都进行了修复,1000w数据的表,修复时间在15分钟左右。

修复完成之后,重新建立主从复制关系,复制关系无误。

总结:

1、myisamchk是一个检查、修复、优化myisam的工具

2、通常被用来修复损坏的myisam表(损坏的理由一般是非正常关闭MySQL)

3、修复的时候,先使用-r参数,如果修复不成功,则使用-o参数。

4、如果服务器上有大量剩余内存,可以搭配key_buffer_size等参数使用,提高修复效率

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!