mysql通过binlog日志恢复数据

  1. 前提条件
    开启备份
  2. 备份及恢复原理
    了解mysql主从复制,就知道slave会开启一个线程,去获取master的binlog二进制文件,用于同步数据,mysql通过binlog恢复数据也便是如此的,只不过是我们人为通过mysqlbinlog工具执行binlog文件罢了
  3. 恢复步骤
    事件描述
    线上系统不断更新一张表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

如下图:

mysqlbinlog 恢复某一张表 mysqlbinlog 恢复数据_数据库


这个时候数据就已经恢复了