Peaceful mind Where there is a will, there is a way!

5May/090

mysql 恢复数据

最近公司的项目碰到一个棘手的问题,就是后台管理员不小心把用户的相关投票数据清除了。刚开始的时候我以为肯定没救了.说实话,以前很少也没机会碰到类似的问题。没想到在同事和牛人们的指导下大致总结了一些思路:

1.查看数据库中其它表中是否有投票数据的痕迹,比如每个投票动作的记录。很可惜的是,我们居然连这个记录都一起干掉了,oh my god!数据一个都不留!!

2.通过google和baidu等搜索引擎查找相关页,看是否保存有相关记录,当时有人用这个尝试去找数据的时候我感到太绝了。然而还是只能找到部分数据,这个只适合删除个别数据,并且量不大的情况

3.使用mysqlbinlog工具来恢复数据,这也是比较麻烦的一个办法,但毕竟能把数据找回来,当然要花点时间研究一下啦

环境还是在我经常用的freebsd下。mysql默认安装就可以。

(1)mysql 二进制日志的位置? 我开始以为在/var/log/下,结果发现找到。怪了,难道是我没记录日志?不可能啊,查看/etc/my.cnf中log-bin是启用的,那到底在哪里哦?最后发现用SHOW BINLOG EVENTS命令(mysql 4.1.13)可以查到文件名,然后在根目录下用find / -name lee-bin.000001就可以查到日志的位置了。搞了半天在/var/db/mysql4/下面放着呢?原来是编译的时候指定了mysql数据存放的目录在此,没想到log也扔到这里来了。

(2)使用mysqlbinlog /var/db/mysql/lee-bin.000076 > /tmp/mysql_restore.sql 查看曾经做过那些见不得人的sql,由于lee-bin.000078是二进制的,因此用mysqlbinlog才能查看到原始的内容,一个典型的的mysqlbinlog日志为(目前还不是很理解,留着慢慢研究)

Code

这里可以很清楚的看到update和delete等操作,当损坏的数据量不是很大的时候,可以用手工去数据库中执行对应的sql语句,如果数据量很大,可能需要进一步分析日志中的内容。也可以通过mysqlbinlog恢复至最近的时刻点。^_^

/usr/local/mysql4/bin/mysqlbinlog  --stop-position="672" lee-bin.000001 | /usr/local/mysql4/bin/mysql -ulimeuser -p123456(恢复删除的数据)