西西河

主题:【原创】用 TMD 文件修复损坏的 mysql 的数据库某个表 -- 铁手

共:💬6 🌺7
全看树展主题 · 分页首页 上页
/ 1
下页 末页
家园 【原创】用 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有关?不过不重要了。

家园 查了一下,TMD文件是执行myisampack后生成的压缩文件

它可使文件压缩40%—70%。

那个表是否太大了?(表太大时,系统会强制执行这个命令?)

参考:

外链出处

家园
家园 学习一下。佩服铁大 :)
家园 应该是一个操作过程中的临时文件

(myisampack creates an intermediate file named tbl_name.TMD in the database directory while it compresses the table.

也就是说,如果是压缩的话,这个后缀的名字,应该是一个临时过渡文件。但是令我非常难以理解的是,为什么原来的数据文件会消失,而这个临时文件却存在。

最大的可能性是:系统从数据文件建立临时文件,然后删除原始数据文件准备从临时文件重建的时候,突然出现问题,导致数据文件不能重建。

那个表的确是比较大。

家园 铁大不是用粗吧

我以为是“用

TMD
文件修复损坏的 mysql 的数据库某个表”???

再一看

原来是授人以渔。

全看树展主题 · 分页首页 上页
/ 1
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河