记一次阿里云mysql数据库innodb表引擎恢复

LAMP 17codes 271℃ 0评论

中午午休前,突然被告知,数据库被某不小心批量更新了。

此时心里千万只草泥马奔腾而过,睡意渐醒,第一时间跑去看数据库的备份,看到备份日期,心里拔凉拔凉的,居然只有五月的备份,此时内心是假作淡定。立马登录阿里云后台的数据库控制台,之前记得阿里云有帮忙自动备份数据库,还是全备。balabala的从阿里云下载好全备的数据。

拿到阿里云的全备数据之后,看到data数据目录下有我要的.frm   .ibd 文件,ok,直接拷贝到我本地的mysql数据库里面,以为大功告成,查看表数据的时候居然提示:1146错误,找不到表XX,反复操作几次之后,还是一直报这个错误。但是这个表明明存在,但是为何查询数据的时候,就一直提示表不存在啦,通过show tables,也能显示出表。开始怀疑人生了。。。。。

无奈之下,只能百度走起,查看了下相关文章,原来mysql根据data文件恢复数据,是分不同的存储引擎的,如果是MYISAM的话,可以直接把data目录下的.frm   .MYD和.MYI三个文件拷贝到相同版本的mysql数据库就ok啦,针对于INNODB的存储引擎,还需要data目录下的ibdata1文件,有其他文章上说是需要三个文件ib_logfile0、ib_logfile1和ibdata1文件,我自己测试之后,发现只需要一个ibdata1文件就好了,想必ibdata1才是真正记录数据表的地方。网上有文章介绍说mysq中innodb引擎的数据,可以通过工具innodb-tools来恢复,后面有时间,可以尝试下。

到现在,表里面的数据已经恢复到凌晨2点了,也就是说仍然有部分数据并没有真正的还原。剩下的数据可以通过mysql提供的binlog日志来恢复,依旧是去下载阿里云自动备份的binlog日志。解压下载好的binlog日志之后,找到时间点,提取出sql语句。

执行mysqlbinlog命令去查看binlog然后重定向到文本中,需要添加参数–base64-output=decode-rows -v,设置编码row模式,设定好需要的时间段筛选 –start-date=’2017-06-01 02:00:00′ –stop-date=’2017-06-01 12:00:00′

E:\>mysqlbinlog --base64-output=decode-rows -v  --start-date='2014-09-16 14:00:00' 
--stop-date='2014-09-16 14:20:00'  mysql-bin.000213>a.sql

检查到a.sql文件中,可以进一步进行筛选,然后执行sql。至此,表里面的数据,全部恢复过来。

作者:一起代码网
原文链接:http://www.17codes.com/archives/115
欢迎转载,但请保留作者和本文链接,谢谢!
欢迎在下面的评论区与我交流。

转载请注明:一起代码 » 记一次阿里云mysql数据库innodb表引擎恢复

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址