mysql数据误删除的恢复,drop表或库的恢复

昨天,我不当心,在没有彻底沟通的状况下,直接删除了一个库,致使同事辛苦了一周的数据丢失,因为是整个库都删掉了,因此并非单纯的去找误操做的日志,而后根据操做sql,去回滚数据。好歹最后恢复了。html

下面就根据我恢复的经历,讲一下mysql数据库数据恢复的方法:python

 

1. 首先,我慌的不行,还好有人提醒我还有binlog日志能够恢复数据,我才恍然大悟,之前没发生过这种事,还没遇到过,环境以下:mysql

mysql 5.6.37 sql

centos7.2数据库

binlog 格式row    ## 这个很重要,必须开启centos

假设须要恢复数据的库为test工具

 

2 . 用mysql自身自带的工具,提取出binlog日志进行分析centos7

 

mysqlbinlog --base64-output=decode-rows -v --start-datetime=“2017--11-01 00:00:00” --stop-datetime="2017-11-11 00:00:00" --database=test mysql-bin.000012 > aaa.sql

 

--base64-output=decode-rows 是在你的binglog格式为row时,进行解码,而后翻译成常见的sql语句供咱们查看分析。spa

mysql-bin.000012 就是binlog日志,binlog日志会根据日志文件大小不断保存为多个文件,须要找到你的操做的日志所在的文件,通常在最新的binlog文件中。.net

 

内容大体以下:

 

end_log_pos 69295 CRC32 0x015beaa8        Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1507437319/*!*/;
COMMIT                         ## end_log_pos 为标识点,须要注意#171008 12:35:19 server id 1  end_log_pos 69295 CRC32 0x015beaa8        Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1507437319/*!*/;
COMMIT                         ## end_log_pos 为标识点,须要注意

 

而后,根据实际状况,找到本身误操做的起始点和结束点,  就是两个end_log_pos的值。而后导出为sql文件,须要将sql文件反写,也就是insert变成delete等,能够参考使用binlog2sql工具。

 

mysqlbinlog --start-position=123212(起始点) --stop-position=3333333(结束点) --database=test mysql-bin.000012 > restore.sql   ## 起始点结束点则是操做的 end_log_pos值

 

ps: 另外,--start-position 指定的end_log_pos是不会被提取的,会从指定的这个end_log_pos的下一条日志开始。

但 --stop-position 指定的end_log_pos是会被提取出来的。你们提取指定节点之间的操做日志时须要注意。

 

而后执行:

mysql [-f] -u root -p < restore_fanxie.sql     ## 执行导出的sql文件的反写sql,怎么反写能够本身手动也能够用工具:binlog2sql

-f : 这个为忽略错误,继续执行的参数,能够根据状况肯定是否使用。
 

 

 

 

重点来了:

若是像我同样直接drop表或者库的话。在binlog日志里是不会记录删除的数据的,因此没办法经过上面这样来恢复数据

这种时候就要找一个起始点,以删除操做以前的点为结束点,将数据binlog从新执行一遍,至关于从新重复全部的操做,来恢复数据。以最近的备份数据的备份时间来做为起始点,drop操做的前一个操做为结束点。

     这个起始点和结束点就须要本身经过数据库备份文件和binlog日志本身去分析找到,而后执行下面命令导出sql

 

mysqlbinlog --start-position=123212(起始点) --stop-position=3333333(结束点) --database=test mysql-bin.000012 > restore.sql

 

 

 

中间,须要先将备份数据覆盖原数据: 先删除掉原数据库,新建一个同名数据库,而后将备份数据导入:

 

mysql -u root -p test < test_bakup.sql

而后执行:

mysql [-f] -u root -p < restore.sql

 

 

 

 

若是没作备份怎么办,没有天天的全量备份数据。那怎么办,一些drop了表或数据库怎么办,怎么恢复呢?!  网上说,通常是没但愿的,但实际上并非的,仍是能够恢复的,但,前提是,你的binlog日志文件齐全。

怎么作呢,很简单,同样的想法,从头执行全部操做,也就是从你的binlog日志文件里,将相关数据库的全部日志数据所有导出为sql文件,而后依次所有从新执行,也就是从执行以下命令:

 

mysqlbinlog --database=test mysql-bin.000001(这里依次将全部binlog日志里相关库的日志都提出来) > restore01.sql   ## 依次从01一直到你如今最新的binlog文件

ps:最新的binlog日志时,须要设定结束点,结束点为你drop表或库的上一个操做的end_log_pos。

而后,依次执行:

 

mysql [-f] -u root -p < restore01.sql(从01一直到最新的)  ## 依次执行,就至关于重新重复从你mysql服务第一次启动开始,到你删除库以前的全部对于test数据库的操做。

 

 

 

这样,就能恢复数据库了。可是你们最好仍是记得备份数据,这样从头执行不知道会出现什么千奇百怪的问题,万一不行就只能天台了。so,数据备份很正常。这里分享一个mysql每日全量备份数据的python脚本吧:

https://blog.csdn.net/weixin_41004350/article/details/79287600