mysql 找回误删表的数据方法(必看)
有备份的话很简单,只需要生成一个最近备份的数据然后用mysqlbinlog找回备份时间点之后的数据再恢复到现网即可。
要是没有备份可能就会比较麻烦,找回数据的成本也是非常之高的.
下面介绍下mysqlbinlog找回备份时间点之后的数据的办法:
做个简单的实验,将mysql的表数据删除之后,然后用mysqlbinlog找回刚才删除的表的数据。
app表的创建时间和数据的插入:2013-02-0410:00:00
原理:mysqlbinlog
前提:mysql开启了binlog日志
测试删除之前:
mysql>showtables; +-----------------------+ |Tables_in_report_sina| +-----------------------+ |app| |test| +-----------------------+ mysql>selectnow(); +---------------------+ |now()| +---------------------+ |2013-02-0411:45:44| +---------------------+ 1rowinset(0.01sec) mysql>selectcount(1)fromapp; +----------+ |count(1)| +----------+ |10| +----------+ 1rowinset(0.01sec)
开始删除数据:
mysql>deletefromappwhereid=1; QueryOK,1rowaffected(0.00sec) mysql> mysql>deletefromappwhereid<6; QueryOK,4rowsaffected(0.01sec) mysql>selectcount(1)fromapp; +----------+ |count(1)| +----------+ |5| +----------+ 1rowinset(0.00sec) mysql>selectnow(); +---------------------+ |now()| +---------------------+ |2013-02-0412:08:45| +---------------------+
开始找回数据:
1.找到binlog的位置:
/app/mysql/log -rw-rw----1mysqlmysql17KFeb411:43alert.log -rw-rw----1mysqlmysql1.0KNov114:52master-bin.000001 -rw-rw----1mysqlmysql126Dec2514:00master-bin.000002 -rw-rw----1mysqlmysql126Dec2514:02master-bin.000003 -rw-rw----1mysqlmysql126Dec2514:02master-bin.000004 -rw-rw----1mysqlmysql107Dec2514:02master-bin.000005 -rw-rw----1mysqlmysql13KFeb412:02master-bin.000006
可以看到最近被修改的binlog只有master-bin.000006
(要是误删除跨越了好几个binlog找回数据的时候就必须一个个的binlog日志去找回了)
将这一段时间所有执行的sql语句存入到待恢复的sql文件中。
mysqlbinlog--start-date='2013-02-0410:00:00'--stop-date='2013-02-0412:08:45'/app/mysql/log/master-bin.000006>/app/mysql/mysql_restore_20130204.sql
当然在现网环境下,这个时间可能没那么的准确,并且还有其他事务sql语句的干扰。
创建临时数据库
createdatabasefor_bak;
导出当前数据库中被误删的表app
mysqldump-uroot-ppwdmy_dbapp>/app/mysql/app.sql
将现在的数据导入到临时表:
mysql-root-ppwdfor_bak
我们再来看下/app/mysql/mysql_restore_20130204.sql的部分内容:(可以看到罪恶的delete语句)
SETTIMESTAMP=1359949544/*!*/; BEGIN /*!*/; #at12878 #13020411:45:44serverid1end_log_pos12975Querythread_id=5exec_time=974error_code=0 SETTIMESTAMP=1359949544/*!*/; deletefromappwhereid=1 /*!*/; #at12975 #13020411:45:44serverid1end_log_pos13002Xid=106 COMMIT/*!*/; #at13002 #13020411:45:44serverid1end_log_pos13077Querythread_id=5exec_time=1013error_code=0 SETTIMESTAMP=1359949544/*!*/; BEGIN /*!*/; #at13077 #13020411:45:44serverid1end_log_pos13175Querythread_id=5exec_time=1013error_code=0 SETTIMESTAMP=1359949544/*!*/; deletefromappwhereid<6 /*!*/; #at13175 #13020411:45:44serverid1end_log_pos13202Xid=107 COMMIT/*!*/; DELIMITER; #Endoflogfile
可以看到数据是什么时间点删除的。具体的时间也可以用selectfrom_unixtime(1359949544);来查询
令人欣慰的是createtableapp语句和insert的语句也在这个文件之中。在手工去掉delete语句之后在临时库里面进行sourcemysqlbinlog找回来的sql文件
就将app恢复到被删除之前的状态了。然后将临时库的数据导入到现网数据(这个不是这篇文章的重点了)。
要是没有备份,要找回所有app表相关的数据那可能就非常的麻烦了尤其是binlog文件非常多而且每个都比较的大。
那样的话也只有从app的建立到现在用mysqlbinlog来逐个的找回与app表相关dml操作的sql记录,然后整合恢复数据。
我想这种情况一般比较的少。虽然麻烦,但是也不是不能恢复。
以上这篇mysql找回误删表的数据方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。