mysqlcheck
mysqlcheck客户端可以检查和修复MyISAM表。它还可以优化和分析表。mysqlcheck的功能类似myisamchk,但其工作不同。
主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表。
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表损坏原因
服务器突然断电导致数据文件损坏;强制关机,没有先关闭mysql 服务;mysqld 进程在写表时被杀掉。因为此时mysql可能正在刷新索引。
磁盘损坏。
服务器死机。
mysql 本身的bug 。
MySQL中MyISAM表损坏的症状
查询数据时报出错误:Incorrect key file for table: '...'. Try to repair it
查询不能在表中找到行或返回不完全的数据。
Error: Table '...' is marked as crashed and should be repaired 。
打开表失败: 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 #备份并修复表