主题:【原创】用 TMD 文件修复损坏的 mysql 的数据库某个表 -- 铁手
今天数据库中的某个表出现故障,写出修复过程,可能对他人有用。
今天数据库出现问题,其中的一个表出现故障,无法访问。用 repair table, 错误信息为没有这个表。用 mysqlcheck,同样的错误信息。关闭数据库服务,用 myisamchk,还是同样的错误信息。这里说明一下,mysqlcheck 用在数据库服务器在运行的时候,而 myisamchk 必须是在数据库服务器被关闭的时候。因为它可能会和数据库本身的操作起冲突,会导致你的错误还没被修复,而新的损坏确已经出现。务必务必!!
询问服务商的技术支持,回复是数据文件不见了,损伤无法修复,可能的话,需要从备份中恢复数据,并问我有没有备份。
想来想去,不是很死心。因为用备份的内容的话,至少有一天的内容就会很难恢复。铁手会很没面子的!
然后就到服务器去看了看,发现在数据库的数据目录中,那个表的内容的确是不见了,但是却出现了一个从来没见过的文件后缀 .TMD 我当时正恼火,一看到这个后缀,还真是不由自主的乐了。还有这样的名字,不知道取这个名的是不是中国人,当时是不是也很恼火。
正常情况下,一个表有三个文件支持,比如表 dddd:
dddd.MYI --> 索引文件
dddd.MYD --> 数据内容文件
dddd.frm --> 表结构文件
这个时候,却变成了
dddd.MYI --> 索引文件
dddd.TMD --> ????这个是什么东东???
dddd.frm --> 表结构文件
mysql 的网站上没找到相关说明,只看到说是修复损坏的表的时候,有一个选项是强制覆盖这个文件,这个文件是什么,有什么用,却没有找到说明。
网上查找,也是不够幸运,没找到说明,也没找到这种情况下该怎么修复。
看文件大小觉得倒是和原来的数据文件有关联,尺寸不算小。于是该名为 dddd.MYD,先不管是不是。
结果是没效果:myisamchk 老是抱怨没有这个文件,而这个文件却是实实在在的存在在那里。
差点就放弃了。
想想可能还是用备份吧。决定先把目前的先备份,然后再用原来的备份,然后再想办法把半丢没丢的内容找回来。
在关闭数据库服务器的情况下,用 mysqldump
完了以后,嘿,没想到,这个表居然活过来了!原来老说不存在的,现在也认为是存在了。看了看表的内容,好象也没丢失什么。
总结一下:
关闭数据库服务器 shut down mysql
改文件后缀 .TMD --> .MYD
mysqldump 这个表
重启mysql, restart mysql
然后 check table 确认无误。
不太理解的是,在DUMP之前,数据文件明明存在(可以list),不知道为什么myisamchk却老是认为没有。是不是和文件的LOCK有关?不过不重要了。
它可使文件压缩40%—70%。
那个表是否太大了?(表太大时,系统会强制执行这个命令?)
参考:
也就是说,如果是压缩的话,这个后缀的名字,应该是一个临时过渡文件。但是令我非常难以理解的是,为什么原来的数据文件会消失,而这个临时文件却存在。
最大的可能性是:系统从数据文件建立临时文件,然后删除原始数据文件准备从临时文件重建的时候,突然出现问题,导致数据文件不能重建。
那个表的确是比较大。
我以为是“用
再一看
原来是授人以渔。