Mysql 下 Myisam表delete 后 数据恢复问题
By admin
- One minute read - 41 words今日在修改过去的一个程序时, 不小时设置了错误的删除条件,导致几十万条数据丢失, 同时数据库没有打开日志和备份, 请教大侠,有什么方法可以恢复数据.
我已经将对应的三个表文件. MYD,MYI,frm备份出来, 查看了一下文件大小, 好象数据并未丢失, 估计只是设置了删除状态. 使用uedit32打开MYD文件,还可以辨识出数据的确还在. 我想应该是做了标记,将这些数据设置为删除状态,数据并未真正删除掉, 不知道现在可有现成的工具可以通过该数据文件将数据恢复. 如果没有的话, 可能就只能研究一下myisam表的结构,自己尝试恢复了!
希望各位大侠救我!
简单说一下吧:
mysql中的myisam表在正常情况下执行delete 指定删除的记录实际上只是在索引文件中做了删除标记,同时也将数据文件中对记录的头几个字节改写, 但这几个字节具体的与入内容不清楚.(见下方)
通过我研究数据文件, 发现了几种数据类型保存的格式.
varchar: 在该类型数据开始的位置有一个字节来指出后面多少个字节是该字段的内容, 但是有一个例外就是如果后面的内容与varchar字段指定的长度完全相等时,就没有开头的这个字节了.
text: 这个基本上与varchar类型一样, 但是在开始是由两个字节来指出后面的数据长度的. 而且是高位在前,低位在后.
datetime: 为8个字节,同样是低位在前,高位在后, 将其转化为long值后就是yyyymmddhhmmss的格式的数据.
由于我要恢复的表中只有这几种数据类型,所以对其他的类型没有研究.
知道了数据储存的格式, 就可以分析数据文件来读取记录了.
需要注意一点就是如果你在删除数据库插入了新的数据, 那么就有可能将原来的数据覆盖掉. 所以应该在删除出错后立即恢复才能恢复出大部分数据.
想完全恢复数据几乎是不可能了,前面几列的数据已经被修改成不知名的东西了,庆幸的是后面几列的数据还没变。规律还是有一些的,没有删除的数据是很有规律的,每条记录用 0EE0 间隔。被删掉的数据前几列就显得很混乱。不过有标记可以找到每条记录。如下图:从68开始往后数67(注意16进制的)个字节就是下一条记录的长度70,以此类推…
参考: