MySQL myisamchk修复正在使用,无法访问数据表
Posted on December 31, 2009 by axl MyISAM是MySQL的预设storage engine. MyISAM table很容易烂掉(corrupted)。
此文章将教你如何检查/修复这些烂掉的MyISAM tables.
每次你在MySQL DB 制造一个 table,将会在档案系统上同时制造出*.frm、*.MYD,跟*.MYI等三种格式的档案。
*.frm = 用来储存资料表格式(file to store table format)
*.MYD(MyData) = 用来储存资料(file to store data)
*.MYI(MyIndex) =用来储存索引(file to store index)
如何检查DB?哪个table 需要修复:
用root 执行以下指令,假设要检查DB1下的各个table
代码如下 | |
#myisamchk /var/lib/mysql/DB1/*.MYI >> /tmp/myisamchk.log |
萤幕输出中,如果发现以下字样,该资料表就应修复
myisamchk: error: Keypointers and record positions doesn’t match
MyISAM-table ‘/var/lib/mysql/DB1/news_post_comment.MYI’ is corrupted
Fix it using switch “-r” or “-o”
myisamchk: warning: 1 client is using or hasn’t closed the table properly
MyISAM-table ‘/var/lib/mysql/DB1/news_post.MYI’ is usable but should be fixed
myisamchk: warning: 1 client is using or hasn’t closed the table properly
MyISAM-table ‘/var/lib/mysql/DB1/news_post_push_log.MYI’ is usable but should be fixed
Redirect出来的档案中会显示更多资讯。如下
代码如下 | |
Checking MyISAM file: /var/lib/mysql/DB1/yam_bbauth.MYI |
如何利用myisamchk修复烂掉的tables:
找出烂掉的table之后,用以下指令修复,
代码如下 | |
#myisamchk –r /var/lib/mysql/DB1/news_post_comment.MYI |
如果table正被某个application使用,你可能会看到: clients are using or haven’t closed the table properly。
所以建议修复前将mysqld关掉或用FLUSH TABLES锁住TABLES,防止修复时有application对DB TABLE做更动。
如何让检查跟修复同时进行:
代码如下 | |
#myisamchk --silent --force --fast --update-state /var/lib/mysql/DB1/*.MYI |
options 的意义如下:
• s, –silent option: Prints only errors. You can use two -s to make myisamchk very silent.
• -f, –force option: Restart myisamchk automatically with repair option -r, if there are any errors in the table.
• -F, –fast option: Check only tables that haven’t been closed properly.
• -U –update-state option: Marks tables as crashed, when it finds any error.
修复时手动分配记忆体给庞大的DB
庞大的table,修复需要很长的时间。修复时可以手动增加记忆体参数。
代码如下 | |
# myisamchk --silent --force --fast --update-state --key_buffer_size=512M --sort_buffer_size=512M --read_buffer_size=4M --write_buffer_size=4M /var/lib/mysql/DB1/*.MYI |
用myisamchk 获取table资讯
1
代码如下 | |
#myisamchk -dvv profiles.MYI table description: Field Start Length Nullpos Nullbit Type |
最后一招
#myisamchk --help
MySQL 使用 myisamchk 修复 *.MYI 时, 出现下述讯息:
myisamchk: Disk is full writing '/tmp/ST3lJjsW' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to c ontinue after freeing disk space)
myisamchk: Retry in 60 secs. Message reprinted in 600 secs
解法1:
■由讯息可以知道, myisamchk 需要使用到 /tmp, /tmp 容量不够就会出现此讯息, 所以如果 /tmp 可以清出空间, 清出 /tmp 的空间就可以解决了.
但是如果 /tmp 本身切的就不够大, 可以使用下述解法.
解法2:
此解法取自: free disk space error using myisamchk
■myisamchk -rq --sort_buffer_size=256M --key_buffer_size=256M --read_buffer_size=32M --write_buffer_size=32M --sort-index --analyze --tmpdir=/more-disk-space-directory/ /var/lib/mysql/database/T1.MYI
■?: 修改 --tmpdir=/more-disk-space-directory/ 指定到空间比较大的地方去即可.