mysqlcheck

  1. mysqlcheck客户端可以检查和修复MyISAM表。它还可以优化和分析表。mysqlcheck的功能类似myisamchk,但其工作不同。

  2. 主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表。

  3. mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。它确定在要执行的操作中使用使用哪个语句,然后将语句发送到要执行的服务器上。

示例

mysqlcheck -B 指定数据库 -r -S /data/mysql2/mysql2.sock -u root -p'test' >> /var/log/mysqlcheck.log

常用选项

  • --optimize,-o 优化表
  • -h 主机地
  • -P 端口号
  • -F 只检查没有正确关闭的表
  • -r 执行可以修复大部分问题的修复,只是唯一值不唯一时不能修复。
  • -a 分析表
  • -c 检查表,默认选项
  • -m 中等的检查
  • -e 完全检查,很慢
  • --database,-B 指定库 如果没指定,表示全部库
  • --all--database,-A 所有库

  • --fast,-F 只检查没有正确关闭的表。

  • --quick,-q 如果你正使用该选项在检查表,它防止扫描行以检查错误链接的检查。这是最快的检查方法。 如果你正使用该选项在修复表,它尝试只修复索引树。这是最快的修复方法。

  • --silent,-s 沉默模式。只打印错误消息
  • --tables 覆盖---database或-B选项。选项后面的所有参量被视为表名。
  • --socket=/-S 指定套接字

myisamchk

myisamchk,只适用于myisam引擎,使用时需要关闭数据库

myisamchk表损坏原因

  1. 服务器突然断电导致数据文件损坏;强制关机,没有先关闭mysql 服务;mysqld 进程在写表时被杀掉。因为此时mysql可能正在刷新索引。

  2. 磁盘损坏。

  3. 服务器死机。

  4. mysql 本身的bug 。

MySQL中MyISAM表损坏的症状

  1. 查询数据时报出错误:Incorrect key file for table: '...'. Try to repair it

  2. 查询不能在表中找到行或返回不完全的数据。

  3. Error: Table '...' is marked as crashed and should be repaired 。

  4. 打开表失败: Can't open file: '×××.MYI' (errno: 145) 。

常见选项

  • -q 快速修复,一般和-r一起使用,快速修复
  • -r 修复模式
  • -o 能修复-r不能修复的问题。一般会有提示使用-o
  • -i 打印被检测表的信息
  • -m 中等的检查
  • -e 最彻底的检查
  • -a 分析表
  • -s 安静的
  • -B 将.MYD文件备份为file_name-time.BAK
  • --sort-index, -S 以从高到低的顺序排序索引树块。这将优化搜寻并且将使按键值的表扫描更快。
  • -f 强制修复,一般不使用,可能会有数据丢失
  • myisamchk默认只用3M的内存来修复,如果要修复大表的话,显然速度会巨慢,我们可以通过为myisamchk设置更多的内存,来使其运行的更快,
    myisamchk --sort_buffer_size=16M --key_buffer_size=16M --read_buffer_size=1M --write_buffer_size=1M
    一般sort_buffer_size的大小16m就足够用了。
  • myisamchk默认使用选项“--tmpdir”作为临时文件的,如果tmpdir指定内存的话,恢复的表比较大,很容易报内存的错误,所以我们可以用tmpdir指定一个比较大的文件系统
    myisamchk --sort_buffer_size=16m --key_buffer_size=16m --read_buffer_size=2m --write_buffer_size=1m --tmpdir=/tmp

执行myisam表的恢复只要是修复表的三个文件,最常发生问题的文件是数据文件和索引文件

tbl_name.frm:定义(格式)文件
tbl_name.MYD:数据文件
tbl_name.MYI:索引文件

示例

首先进入到对应的数据库下:cd /data/mysql/game | 也可以直接指定表的路径,从而不用进入目录

检查表

#快速的检查
myisamchk -im /usr/local/mysql/data/testx/t2
#只检查没有正常关闭的表
myisamchk -iFm /usr/local/mysql/data/testx/t2
#仅显示表的最重要的信息
myisamchk -eim /usr/local/mysql/data/testx/t2

修复表

#常用的修复命令
myisamchk -rq tbl_name #快速修复表,只修复索引
myisamchk -Br tbl_name  #备份并修复表