mysql全量备份+binlog日志完整恢复数据
首先,数据库在误操作之前必须已经开启了binlog日志功能,且binlog日志的保存周期必须大于全备份的时间周期!
所谓恢复,就是让将全备份的数据全部恢复后,再使用mysqlbinlog命令把binlog日志文件从全备份的时间点开始依次执行到误删除的时间点。而mysqlbinlog就是把binlog日志转成SQL语句的一个工具而已。
模拟数据误操作:
第一步:创建了db库,创建一个tb1表,增加1、2、3共三行数据,并使用flush logs手动刷新日志,这样新日志就会写入下一个新文件;
第二步:创建一个tb2表,但是给tb1表再添加了 4、5、6 三行数据 。然后手动全备份db库(一般都是通过脚本定时在晚上12点备份)。
第三步:给tb2添加了3、2、1 三行数据 ,再给tb1表添加 7、8、9 。
第四步:给tb1表添加 10、20、30 三行数据。 flush logs手动刷新日志。
第五步:创建tb3表,添加 100、200、300 三行数据
第六步:删除表 tb1 和tb2 和tb3 ,然后立马执行flush logs命令手动刷新日志,并查看最新的binlog日志文件的编号
第七步:分析恢复到删除表之前的操作,都需要使用哪些binlog文件
第八步:将数据恢复到误删除表 tb1 和tb2 和tb3之前的数据。
为什么要手动执行flush logs命令刷新日志:每一个binlog日志都指定大小的,当一个文件超出指定大小的时候就会写到下一个文件。手动执行flush logs命令刷新日志就是模拟全备份时间点到误删除时间点之间,模拟已经有多个binlog日志文件的情况。
本次恢复数据会使用到的命令:
(1)查看binlog日志是否开启,以及日志存放路径
show variables like 'log_%'
(2)查看所有binlog日志列表
show master logs
(3)查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
show master status
(4)flush刷新log日志,自此刻开始产生一个新编号的binlog日志文件
flush logs
(5)指定展示某一个binlog文件的所有操作。
show binlog events in 'mysql-bin.00000x'
开始模拟:
第一步:
创建了db库,创建一个tb1表,增加1、2、3共三行数据,并使用flush logs手动刷新日志
第二步:创建一个tb2表,但是给tb1表再添加了 4、5、6 三行数据 。然后全备份db库
全备份db库:
参数含义:
-B :指定要备份的库的名字
-F:备份完成后强制刷新binLog日志,让新的日志写入到新的文件中
-R:备份存储过程等
-x:备份每张表之前先锁表
--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
第三步:给tb2添加了3、2、1 三行数据 ,再给tb1表添加 7、8、9 。
tb1表和tb2表的所有数据,如下图:
第四步:给tb1表添加 10、20、30 三行数据。 并flush logs手动刷新日志。
第五步:创建tb3表,添加 100、200、300 三行数据
第六步:模拟误删除表 tb1 和tb2 和tb3 ,误删除后立马执行flush logs命令手动刷新日志,并查看最新的binlog日志文件的编号
第七步:分析恢复到删除表之前的操作,都需要使用哪些binlog文件
(1)查看全备份数据中的binlog日志的编号和pos点,一般在备份的文件第20行上下
如下图:第22行可以看到我的此次备份文件是mysql-bin.000003,pos点是154
(2)根据第六步误删除后立马执行flush logs命令手动刷新日志,并查看最新的binlog日志文件编号是mysql-bin.000005,pos点是154,说明误操作所产生的的binlog日志在mysql-bin.000004这个文件中,接下来就要查看mysql-bin.000004中对应删除操作的pos点是哪一个。
(3)如下图:可以看到删除tb1表时的pos号是1128。
(4)通过上边的查看,我们可以确定,要想恢复到删除表前的所有数据,要是用的日志文件为:
mysql-bin.000003文件全部恢复
mysql-bin.000004文件恢复pos=4的点到pos=1128之间的操作
第八步:将数据恢复到误删除表 tb1 和tb2 和tb3之前的数据。
(1)恢复手动备份的db库的全量数据(一般都是晚上12点自动备份脚本备份)
(2)依次恢复
mysql-bin.000003文件和mysql-bin.000004文件的pos=4的点到pos=1128之间的数据
全量恢复mysql-bin.000003日志中的数据
如下图:恢复position在4-1128之间的事件
--start-position:从二进制日志中读取指定position 事件位置作为开始。
--stop-position:从二进制日志中读取指定position 事件位置作为事件截至
至此,数据已经恢复到误删除操作之前了,如下图:
快速恢复多个binlog文件并指定pos点:
如下: /software/mysql/data/mysql-bin.00000{3,4}一次指定多个文件,--start-position=4指mysql-bin.000003的pos点, --stop-position=1128指mysql-bin.000004
mysqlbinlog --database=db --start-position=4 --stop-position=1128 /software/mysql/data/mysql-bin.00000{3,4} |mysql -uroot -p123456 -h 127.0.0.1 -v db