首先中要的一点,需要在配置文件中加入log-bin
配置项:
log_bin=mysql-bin
然后会在数据存储的目录(视不同的操作系统)出现mysql-bin.000001文件,这就是用来做恢复的文件.这个会在重启或者是调用FLUSH LOGS
sql代码就会生成新的一个文件.
恢复删除数据的思路
重新生成数据库
1.假如我们不小心操作数据库的时候删除了或者批量更改了数据
这时候
我们需要这样进行处理:
mysqlbinlog --start-datetime= "2016-1-1 12:00:00" --stop-datetime="2016-1-2 12:00:00" /usr/local/var/mysql/mysql-bin.0* > /tmp/bak.sql
起始时间要恢复数据的起始时间(可以设置久远一点,这样可以导出数据库全部数据了),截止时间为误操作的时间(如果不知道,只能整个导出mysql-bin.000001文件,然后查找相应的删除语句,就会有对应的时间戳与position),上述代码会生成可执行的sql语句 注意是在这个时间段的并且属于mysql-bin.000001这个文件的.注意mysql-bin.0* 会把所有的mysql-bin文件集体导出到/tmp/bak.sql
文件当中.
2.我们现在得到了要恢复的文件/tmp/bak.sql
文件,先把当前的数据库(被修改的)导出一份,以防万一.
mysqldump -uroot -p -databases dbname > /tmp/my.sql
或者
mysqldump -uroot -p -A > /tmp/my.sql
3.删除当前数据库
drop database dbname
4.导入从二进制文件的数据
mysql -uroot -p < /tmp/bak.sql
这种方式最直接,操作简单.
至此数据库恢复完毕,其中可能遇到一些问题.
问题1 分散的数据
假设我们执行的是这样一条sql语句:
update orders set name = '1liu' where id = '1liu';
这样的语句注意id
为int
类型, sql语句不会报错,并且会查找id
为1的name
字段更新.
先别惊讶,你可以试下,首先更严重的问题是,你需要怎么恢复?
这条语句直观反应的问题比较简单,在实际环境中你可能会遇到比这严重多的多的后果.
按上述方式恢复坑定的需要不少的时间,有之前这些修改之前的数据还好说,没有的话就很难办.
最最主要的问题是如何查找到我们之前插入的语句,而且上述执行更改的数据可能是分散的,那就更难办了.这样的话只能是重新恢复数据库.
问题2 mysql-bin的文件被删除
你可能会遇到这样的情况,服务器的磁盘空间不知不觉的被占满,结果一看是mysql-bin的二进制文件占用过多的空间,有些人没有删除这些文件之前使用mysqldump
进行备份,那么可以说这是个噩耗,在没有二进制文件可恢复与备份的情况下删除数据库,那么恢复数据会很困难.
建议:再删除这些文件之前,一定要使用mysql-dump
进行一次数据备份,进行mysql-dump
会生成一个最新的mysql-bin
文件.