MySQL恢复不小心误删的数据记录(binlog)-生产实操

同事操作删除生产数据时,未及时备份导致误删除部份数据。现通过mysql的binlog日志回滚数据。

1.由于我们第一时间找到相应的操作时间的大概在12点~13点之间操作删除了product和product_item表的部份数据。因此我们只要找到这期间的binlog文件就行了,

脚本为:delete from product_item where shop_id = '1630131736490098689';

delete from product where shop_id = '1630131736490098689';

bash 复制代码
cd /var/lib/mysql
ll

 

(该图为后面载图的)

2.先cp到其它目录去操作。千万不要在原目录操作!!!!
bash 复制代码
cd /mnt
mkdir  mysqlbak003217
cp /var/lib/mysql/binlog.* /mnt/mysqlbak003217/
3.通过分析找到对应的binlog文件(通过时间缩小范围)并通过mysqlbinlog 命令转为sql文件

binlog.003216,binlog.003217,binlog.003218三个文件中找

bash 复制代码
mysqlbinlog --base64-output=decode-rows -v binlog.003216 --result-file=mysql-bin-sql-003216.sql  
mysqlbinlog --base64-output=decode-rows -v binlog.003218 --result-file=mysql-bin-sql-003218.sql     
mysqlbinlog --base64-output=decode-rows -v binlog.003217 --result-file=mysql-bin-sql-003217.sql 
4找到你误删的数据

一般来说你误删的数据会大致记下来一个标识。我这里是shop_id。记得被删除的数据的是多少,那么我们就可以模糊搜索该条件:

grep '1630131736490098689' mysql-bin-sql-003217.sql -C 200或

grep '1630131736490098689' mysql-bin-sql-003217.sql -C 200 --> 1630131736490098689.sql 输出文件查看下delete from 的脚本。

确认是 mysql-bin-sql-003217.sql文件

5.通过linux命令,查找需的数据,成为需要的数据(#每完成一份正确的数据,都及时备份下文件。以免操作错误重头开始
bash 复制代码
grep 'DELETE FROM' mysql-bin-sql-003217.sql  -C 200 --> delete20231021.sql

#每完成一份正确的数据,都及时备份下。以免操作错误重头开始
cp delete20231021.sql delete20231021.sql.bak

#拆分两个表的操作数据SQL(过程是通过反复操作及分析的结果)
grep 'DELETE FROM `lirimall_server`.`product_item`' mysql-bin-sql-003217.sql  -C 200 --> deleteproduct_item20231021.sql

grep 'DELETE FROM `lirimall_server`.`product`' mysql-bin-sql-003217.sql  -C 200 --> deleteproduct20231021.sql
6。分别处理两个操作数据的文件

删除无效数据,

#包括特殊字符"",#,|"这些的处理,这个只能通过SQL工具测试后有异常再更新文件

bash 复制代码
mkdir product_itme
mkdir product
cp deleteproduct20231021.sql ./product
cp deleteproduct_item20231021.sql ./product_item/
 

cd product


#备份数据
cp deleteproduct20231021.sql deleteproduct20231021.sql.bak

#删除无用的数据,特殊字符的数据
vi deleteproduct20231021.sql
#文件命令:
#显示行数
:set nu
#删除1-200行的数据
:1,200d
#删除336581~336938d行的数据
:336581,336938d
#搜索"# at"的数据
/# at
#到文件的结尾处查看下
:$

#包括特殊字符"",#,|"这些的处理,这个只能通过SQL工具测试后有异常再更新
7.通过linux的sed 命令把delete删除语句替换为insert into语句(有问题可反复执行-一定要备份文件)-
bash 复制代码
sed -i 's/^### //g' deleteproduct20231021.sql
sed -i "s/^DELETE FROM/INSERT INTO/g" deleteproduct20231021.sql
sed -i "s/^WHERE/VALUES(/g" deleteproduct20231021.sql
sed -i '/INSERT INTO/i );' deleteproduct20231021.sql


cat deleteproduct20231021.sql  | awk -F"=|" '{

    if($0 ~ /^INSERT|^VALUES|^);/){

        print $0;

    }else{

        printf $2",";

    };

}' > delete2insertproduct20231021.sql


sed -i "s/,);$/);/g" delete2insertproduct20231021.sql

vi  delete2insertproduct20231021.sql
#删除开头和补齐结束的SQL
8.通过处理后的insert into语句在SQL工具(我是HeidiSQL)逐步执行下,有异常可反复操作步骤6和7,以达到需要的效果。

注:一定不要在原数据库实例上操作。可以新建一个数据库实例和表进行操作。我是在测试环境的数据库进操作验证的,验证的数据同步到生产。再进行回滚数据的。

参考:

MySQL如何恢复不小心误删的数据记录(binlog)_mysql恢复误删的数据-CSDN博客

https://www.lmlphp.com/user/62049/article/item/2326681/【精选】sed -i 命令入门详解_码灵的博客-CSDN博客

相关推荐
lldhsds2 分钟前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
Acrelhuang19 分钟前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
wowocpp25 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君37 分钟前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维42 分钟前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
筱源源44 分钟前
Elasticsearch-linux环境部署
linux·elasticsearch
十叶知秋1 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
亦枫Leonlew2 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节
小肥象不是小飞象2 小时前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
pk_xz1234563 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器