首先咱们来建立一个数据库,mytestmysql
create database mytest;
接着咱们来建立一张表sql
use mytest; create table t1(id int ,name varchar(20));
而后咱们插入两条数据数据库
insert into t1 values (1,'xiaoming'); insert into t1 values (2,'xiaohong');
下面咱们对mytest数据库进行备份,备份到/root/bakup/测试
mysqldump -uroot -p -B -F -R -x --master-data=2 mytest | gzip > /root/backup/bak_$(date +%F).sql.gz
参数说明:3d
-B:指定数据库 -F:刷新日志 -R:备份存储过程等 -x:锁表 --master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
查看备份文件日志
这样呢,咱们就把数据作了一个完整的备份。下面来删除数据库,而后经过备份数据进行恢复数据库。code
gzip -d bakup_xxx.gz mysql -uroot -p < bakup_xxx.sql
这样咱们就把数据导入到库里了。blog
继续上面的操作,咱们新增xiaoli和xiaozhao这两条数据,并把xiaozhao这条记录删除掉。事件
在删除以前,咱们先来刷新binlog日志,生成一个新的日志,那么咱们以后所要操作的内容都会被记录到新的日志文件中。(经过前面binlog日志的详细说明咱们知道,每次刷新和服务重启的时候,都会生成一个binlog日志文件。)图片
flush logs; show master status;
咱们注意,binlog的文件是0009,位置是在154,这两个信息很重要
下面咱们来作插入和删除操做
这个时候咱们应该是来查看一下binlog日志的状态,以便与咱们一会来进行恢复到此状态,可是,真正的环境中咱们并不知道这个状态,所以这里也就不去查看这个状态了,这个状态的值能够经过后面查看binlog日志文件来进行分析。下面咱们开始误操做:
咱们来把xiaozhao删除掉
这样数据就删除掉了,下面咱们再来查看binlog的状态
show master status;
这个时候咱们发现我删除操做是个错误的操做,要进行恢复,那么该如何恢复呢?这个时候咱们就能够经过binlog的position来进行恢复。 在进行其余的处理以前,咱们建议,立刻再执行一次flush logs,也就是让出错的部分就集中在这么一个binlog日志文件中。
咱们来查看0009的binlog日志。
咱们看到delete_rows 结束点是928这个点,起始点是在755这个点,咱们能够把操做的这些数据删除到咱们上次备份的内容,而后经过执行binlog来进行恢复,固然恢复到755这个点以前。
好比我上次备份的是整个数据库,我就能够把整个数据库删除,而后经过备份文件恢复,而后再经过binlog作增量恢复。这样数据就回来了。这里就再也不进行删库了,咱们直接演示使用binlog日志恢复数据的方法
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
好比咱们要把全部的操做都恢复(不包括咱们的删除,咱们知道删除是在755点上):
mysqlbinlog mysql-bin.000009 --start-position 154 --stop-position 755 | mysql -uroot -p mytest
再来查看表
咱们发现xiaozhao又回来了,固然了,这里多了一个xiali,是由于我以前并无删除备份前的数据。固然了,咱们在恢复的过程当中能够选择只恢复xiaozhao这么一块内容
下面是binlog日志恢复中一些经常使用的参数
--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间 --stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述同样 --start-position:从二进制日志中读取指定position 事件位置做为开始。 --stop-position:从二进制日志中读取指定position 事件位置做为事件截至