mysql通过binlog日志恢复数据
- 前提条件
开启备份 - 备份及恢复原理
了解mysql主从复制,就知道slave会开启一个线程,去获取master的binlog二进制文件,用于同步数据,mysql通过binlog恢复数据也便是如此的,只不过是我们人为通过mysqlbinlog工具执行binlog文件罢了 - 恢复步骤
事件描述:
线上系统不断更新一张表A
然后公司来的实习生线上排查问题,误操作删除了A表中的一行或多行数据
线上系统不断更新一张表A
binlog日志会记录操作步骤,如图所示:
此时我们的期望是:还原删除的数据,而且不丢失后续的更新操作
思路:先恢复到(delete_rows)删除之前的数据,然后再跳过删除 操作,最后恢复删除操作后的数据
注意:使用binlog文件恢复mysql数据,即使重复执行以下之前执行过的步骤(比如删除一条记录,然后直接使用mysqlbinlog恢复Delete_rows,就会报错了can find record,因为数据已经删除了,重新执行Delete_rows肯定会报错的)
步骤:
先记录一些指令:
#查看log_bin是否开启,以及查看log_bin存储的位置
show variables like '%log_bin%';
#查看binlog文件列表
show master logs;
#查看指定binlog文件记录事件
show binlog events in 'binlog.0000001';
#使用mysqlbinlog执行binlog进行恢复
mysqlbinlog --start-position=3905 --stop-position=4045 --database=zxz /var/lib/mysql/binlog.000011 | /usr/bin/mysql -uroot -p12345678 -v zxz
mock
创建一个表t
插入一些数据
更新id=7的数据
删除id=6的数据(误删的数据)
更新id=8的数据
- 使用show master logs查看当前操作记录的文件
- 使用show binlog events in 'binlog.0000001’查看详细记录(我的操作记录再binlog.000011)
show binlog events in ‘binlog.000011’; - 使用mysqlbinlog进行数据恢复
现在就拿binlog.000011文件进行数据恢复,上图可以看到,第2410-2535行是创建了表,如果表t存在的话,我们从第2410开始恢复数据,就会报database exist错误,所以我们可以先把表删了,然后再从2410恢复至3540(创建表,插入数据,更新数据)
mysqlbinlog --start-position=2410 --stop-position=3540 --database=zxz /var/lib/mysql/binlog.000011 | /usr/bin/mysql -uroot -p12345678 -v zxz
此时,数据恢复了一部分,id为7的被更新,id=6的数据还在,id=8的数据未被改
然后跳过删除,执行更新id为8的数据
mysqlbinlog --start-position=3905 --stop-position=4045 --database=zxz /var/lib/mysql/binlog.000011 | /usr/bin/mysql -uroot -p12345678 -v zxz
如下图:
这个时候数据就已经恢复了