误删生产数据?利用mysql的Binlog进行恢复操作

发布时间 2023-05-30 09:29:17作者: Rick_Leee

恢复至某个时间段的Mysql操作,和查看sql重新执行被删sql

如果不小心删除了生产数据,你又想批量恢复, 只要你的mysql开启了binlog,那么是可以恢复的。

1、检查是否开启binlog
show variables like 'log_%';
保证为ON,记录下 log_bin_basename, 这是你的binlog存放位置 如:/var/lib/mysql/binlog
image

2、确认开启了Binlog,那就好办了,接下来备份好你现在的数据库,并且最好是开启只查询,不给更新避免新的数据继续丢失。

show binary logs;
image

找到自己对应的logs,我是最近操作的,所以是记录在号码最大的binlog.000002上面

3、我的mysql是在容器里面,所以我要进入到容器
docker exec -it xxxxx容器 /bin/bash 或者是/bin 我忘了具体的

4、 找到你的binlog文件

进去后,找到你的mysqlbinlog

root@035c191cb855:/usr/bin# whereis mysqlbinlog
mysqlbinlog: /usr/bin/mysqlbinlog

进到 /usr/bin/ 里面,和mysqlbinlog同一级 然后查看是否是你执行的sql 命令:

参数说明: --database=digital_village  这里是数据库名称, 然后是开始结束时间段内的执行记录,/var/lib/mysql/binlog.000002  然后就是刚才记录下的binlog,     /var/lib/mysql/abc2.txt  这里是把他转成txt后存放在哪里?我是放在这个我挂在区域的位置,方便拿出来查看,因为可能很大。
命令: mysqlbinlog --no-defaults --database=digital_village --start-datetime="2023-05-29 09:00:00" --stop-datetime="2023-05-29 17:00:00" /var/lib/mysql/binlog.000002 > /var/lib/mysql/abc2.txt

5、 拿到刚才的abc2.txt文件,我进行查看,我发现是在这里开始删的,并且把 # at 111216142 记录下来:

image

6、回滚到具体的事务版本号

 回到刚才数据库容器中, 把刚才的 # at 111216142 填入,  该命令就是 回滚操作, 这里可能会报错,数据库已经存在了,所以我们把数据库整个Navicat 转sql,导出来,再删除库 避免出问题再操作。
 
执行:   ./mysqlbinlog -d digital_village --stop-position='111216142' /var/lib/mysql/binlog.000002 | mysql -uroot -p

输入数据库密码,  然后就发现数据回来啦

实时告诉我们,操作数据库一定要备份在备份。避免出现大问题!!! 希望你们用不上!!!