昨天,我不当心,在没有彻底沟通的状况下,直接删除了一个库,致使同事辛苦了一周的数据丢失,因为是整个库都删掉了,因此并非单纯的去找误操做的日志,而后根据操做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