手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

误操作删除数据和制作日志。

时间:2021/4/27 20:35:53|来源:|点击: 次

今天,发现一个事务失败了,导致今天做的数据有问题。
至于数据?垃圾数据没啥用。
但是丢数据了!!!!!!!
今天丢的是垃圾数据,明天就不是了!!!

问题描述:MYSQL数据库,没有BINLOG(生产库,问别人,说怕硬盘不够用……)
然后,从后台删除数据。

开启事务。
先备份要删除的数据:

insert into t2
select * from t1 where t1.a =1;

然后,删除数据

select * from t1 where t1.a = 1;

然后,开启日志进行执行。
断网。insert的数据回滚。
然后重新执行删除操作。

select * from t1 where t1.a = 1;

查看日志:在这里插入图片描述

成功insert 一条。
成功插入两条。
成功插入四条。
没有提交命令。

备份的数据呢?没了。

然后,重新执行DELETE。
然后;这个成功了。

如何回滚?
1.通过主键删除的,就知道主键删除了几行。
2.日志呢?
日志无数据。
3.备份呢?今天的数据,最早的数据在20多天前。

然后,发现有一个数据不是通过索引删除而是通过完全匹配删除的。(如果有索引走索引删除,如果没有索引通过字段匹配删除,正好这个表没有索引所以字段匹配删除的)。
通过这个工具恢复了重要数据,然后定位:垃圾数据。
既然是垃圾数据,那就无所谓了——天知地知你知我知,我不说没人知道。

主要原因:使用手动提交,连接数据库的时候断网,没有提交commit。
然后自己没有这个习惯不核实数据。
有备份的习惯,但是没备份成。
今天想了一个办法可以解决这个问题:
通过程序复制一份带所有命令的SQL,然后把这个SQL进行备份。
在这里插入图片描述
这样就会生成一个INSERT命令。
然后修改表格名即可生成对应的备份文件。
由于SQL会自动留档(我自己设置的SQL日志),这样以后误删除数据的时候,就有insert语句以供恢复。

如果必须要UPDATE数据的时候,也可以生成insert语句。
TIP:为啥用insert?是因为其他三个生成的时候只保留主键信息……

然后,通过主键删除数据。

这样如果insert失败也会有对应的SQL语句。

真的是:
一个是手工提交真心有点坑,第二个是生产库不开闪回一个月备份一次……
真的有点难啊……

Copyright © 2002-2019 某某自媒体运营 版权所有