用 TMD 文件修复损坏的 mysql 的数据库某个表
时间:2008-03-20 来源:剑心通明
今天数据库出现问题,其中的一个表出现故障,无法访问。用 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有关?不过不重要了。
注:
TMD文件是执行myisampack后生成的压缩文件,它可使文件压缩40%—70%。
参考:http://dev.mysql.com/doc/refman/4.1/en/myisampack.html
Produce a packed table even if it becomes larger than the original or if the intermediate file from an earlier invocation of myisampack exists. (myisampack creates an intermediate file named tbl_name.TMD in the database directory while it compresses the table. If you kill myisampack, the .TMD file might not be deleted.) Normally, myisampack exits with an error if it finds that tbl_name.TMD exists. With --force, myisampack packs the table anyway.
询问服务商的技术支持,回复是数据文件不见了,损伤无法修复,可能的话,需要从备份中恢复数据,并问我有没有备份。
想来想去,不是很死心。因为用备份的内容的话,至少有一天的内容就会很难恢复。铁手会很没面子的!
然后就到服务器去看了看,发现在数据库的数据目录中,那个表的内容的确是不见了,但是却出现了一个从来没见过的文件后缀 .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有关?不过不重要了。
注:
TMD文件是执行myisampack后生成的压缩文件,它可使文件压缩40%—70%。
参考:http://dev.mysql.com/doc/refman/4.1/en/myisampack.html
Produce a packed table even if it becomes larger than the original or if the intermediate file from an earlier invocation of myisampack exists. (myisampack creates an intermediate file named tbl_name.TMD in the database directory while it compresses the table. If you kill myisampack, the .TMD file might not be deleted.) Normally, myisampack exits with an error if it finds that tbl_name.TMD exists. With --force, myisampack packs the table anyway.
相关阅读 更多 +