Mysql二进制日志(binlog)恢复数据

开启binlog

show binary logs 检查bin log是否开启,Mac OS系统安装完Mysql没有my.cnf配置文件,须要本身新建,个人Mysql配置文件放在/etc/my.cnf,将binlog开启,默认若是不给值的话,log-bin 的会以mysqld-bin 为索引,建立mysqld-bin.00001等;重启mysql。mysql

定时备份与还原

通常咱们会对mysql数据库作定时备份,可是不可以知足咱们的需求,由于可能会丢失数据,若是咱们在天天的早上4点进行定时数据备份,在当天晚上9点,数据库挂了,此时数据库只能备份到当天4点以前的全部数据,4点-9点的数据没办法经过这种方式恢复,丢失了,这确定是不能容忍的,经过二进制日志文件能够知足咱们的需求,只要不是服务器、硬盘问题,都能经过这种方式,进行数据恢复。咱们先来看下对数据库的彻底备份。git

mysqldump -uroot -ppassword test > /Users/ksmaster/GitHub/mysql_backup/test_DB0722-10:16.sql

本地生成test_DB0722-10:16.sql文件以后,假如数据库数据被人为无心损坏或是数据表或库被误删,咱们都可以经过生成的sql文件进行数据恢复,恢复当天4点以前的数据状态。假如此处是把整个库误删了,恢复以下:github

mysql -uroot -ppassword test < /Users/ksmaster/GitHub/mysql_backup/test_DB0722-10:16.sql

利用二进制日志(binlog)还原

我预先建立了一个新的数据库test,表user,以后查看二进制日志文件,由于个人是本地数据库,二进制日志存放在/usr/local/mysql/data/目录下,如mysql-bin.000001
image
我这里有两个二进制文件,mysql-bin.000001和mysql-bin.000002,若是你没有执行过flush logs或者没有重启mysql,通常来讲只有一个mysql-bin.000001,咱们先查看下mysql-bin.000001sql

sudo mysqlbinlog --no-defaults mysql-bin.000001

截图以下:image
能够看到有建立数据库、建表、插入数据等sql语句,还有at 417等,咱们插入一些脏数据或者是错误数据,甚至是把数据库删除均可以,以后咱们如何利用二进制文件进行数据恢复呢?数据库

mysqlbinlog --no-defaults --stop-position="3263" mysql-bin.000001 > /Users/ksmaster/GitHub/mysql_backup/test_backup0722-11:30.sql

咱们将mysql-bin.000001的sql语句导出到本地,这里咱们只导出位于3263以前的语句,由于以后的数据是错误的咱们不想要;而后进行恢复,咱们先来看下处处到本地的sql语句是怎样的:image
这里贴代码的话,无用的代码太多,只截取部分看看是什么样子的,其实就是执行过的sql语句,若是咱们把数据误删了,咱们能够利用导出的sql语句进行数据恢复:服务器

mysql -uroot -ppassword < /Users/ksmaster/GitHub/mysql_backup/test_backup0722-11\:30.sql

经过这种方式咱们能够比较灵活的恢复本身想要的数据,而且没有丢失数据,只要二进制文件在硬盘没有损坏,都能恢复咱们想要的数据。spa

总结

若是容许数据丢失,能够直接使用mysqldump直接恢复,不然能够经过二进制文件进行恢复。在这里忽然想到我去年还在实习的时候,当时项目刚开始,主力成员加上我和技术经理就三我的,有次我打开了mysql workbench,有多是我不当心碰到键盘了仍是别人搞得,整个数据库表全没了...庆幸的是还好是开发环境,不是生产环境..究竟是不是我搞的我到如今也不知道是否是我搞得,而后另外一个同事就着急了,工做这么忙项目一个月以后上线,建表造数据这又得浪费一些时间,摊谁身上谁都不乐意,因而他去找另外一个同事,看能不能恢复,最后也没搞定。如今看来其实也很是简单了,找到开发服务器上的二进制日志文件就能恢复了,最后他又一个一个表开始建的,谁叫我当初又蠢又笨...日志

相关文章
相关标签/搜索