赞
踩
同事操作删除生产数据时,未及时备份导致误删除部份数据。现通过mysql的binlog日志回滚数据。
脚本为:delete from product_item where shop_id = '1630131736490098689';
delete from product where shop_id = '1630131736490098689';
- cd /var/lib/mysql
- ll
-
(该图为后面载图的)
- cd /mnt
- mkdir mysqlbak003217
- cp /var/lib/mysql/binlog.* /mnt/mysqlbak003217/
binlog.003216,binlog.003217,binlog.003218三个文件中找
- 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
一般来说你误删的数据会大致记下来一个标识。我这里是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文件
- 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
-
-
删除无效数据,
#包括特殊字符"",#,|"这些的处理,这个只能通过SQL工具测试后有异常再更新文件
- 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工具测试后有异常再更新
-
-
-
-
- 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
注:一定不要在原数据库实例上操作。可以新建一个数据库实例和表进行操作。我是在测试环境的数据库进操作验证的,验证的数据同步到生产。再进行回滚数据的。
参考:
MySQL如何恢复不小心误删的数据记录(binlog)_mysql恢复误删的数据-CSDN博客
https://www.lmlphp.com/user/62049/article/item/2326681/【精选】sed -i 命令入门详解_码灵的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。