mysql 表数据误删 如何恢复
我目前尝试的方法是利用,mysql 的 binlog 日志文件来回滚数据,但是按照日志文件的时间或者 position 起始和结束来回滚不太方便,假如我的数据库中对多个业务表中的已经进行了 N 多数据操作,这时候我要进行回滚,没办法从日志表挑选我所要回滚的业务表的所有日志。
各位猿友是否进行过如此操作,有没有更高效的方法?
如果开启了备份日志,那么可以使用备份日志恢复
binlog可以借助工具,搜一下应该有工具辅助
可以使用日志恢复:
https://blog.csdn.net/Allenzyg/article/details/106446992?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168472707316800211512734%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168472707316800211512734&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-106446992-null-null.blog_rank_default&utm_term=binlog&spm=1018.2226.3001.4450
使用MyFlash恢复:
https://blog.csdn.net/wang0907/article/details/126530591
数据表说明:
成绩表grade1(id,name,score)参数说明:
id:学生编号,name:学生姓名,score:学生成绩
成绩表grade2(sid,cid,score)参数说明:
sid:学生编号,cid:课程编号,score:课程成绩
数据表创建:
创建数据表grade1:
# 创建学生成绩表:
create table grade1(
id int,
name varchar(10),
score int (10)
)engine myisam charset utf8;
# 向成绩表中插入数据:
insert into grade1 values
(1,'张无忌',85),
(2,'李隆基',59),
(3,'王五',60),
(4,'曹操',79),
(5,'小明',90),
(6,'如花',60),
(7,'尉迟恭',100),
(8,'欧阳风',90),
(9,'刘备',90),
(10,'董永',99),
(11,'冯钰',83),
(12,'孙殿英',82);
创建数据表grade2:
# 创建成绩表:
create table grade2(
sid varchar(10),
cid varchar(10),
score decimal(4,1)
)engine myisam charset utf8;
# 向成绩表中插入数据:
insert into grade2 values
('01','01',80),
('01','02',90),
('02','01',70),
('02','02',60),
('02','03',80),
('02','04',85),
('03','01',80),
('03','02',80),
('03','03',80),
('03','04',61),
('04','01',75),
('04','02',30),
('04','03',20),
('04','04',45),
('05','01',76),
('05','02',87),
('05','03',99),
('05','04',75),
('06','01',31),
('06','02',65),
('06','03',34),
('07','02',89),
('07','03',98),
('09','03',82),
('10','01',88),
('10','02',90),
('13','01',59),
('13','02',79),
('13','04',81);
相关子查询
查看grade2表中的具体数据:
从grade2表中查询出每位学生大于其所修全部课程平均分的课程分数信息:
select * from grade2 as temp1
where score > (select avg(temp2.score) from grade2 as temp2 where temp2.sid = temp1.sid);
结果:
不相关子查询
查看grade1表中的具体数据:
select * from grade1
从grade1表中查询出分数大于所有学生平均分的学生的成绩信息:
select * from grade1 where score > (select avg(score) from grade1);
结果:
参考:
https://dev.mysql.com/doc/refman/5.7/en/correlated-subqueries.html
https://blog.csdn.net/qiushisoftware/article/details/80874463
回答:
是的,我曾经遇到过MySQL表数据误删的情况。以下是我尝试过的一些方法:
利用binlog日志文件来回滚数据。您已经尝试过了,按照日志文件的时间或者position起始和结束来回滚不太方便。有一个更高效的方法是,利用子查询/连接+索引来定位元组的位置,然后读取元组。具体的SQL语句可以参考参考资料中的内容,对于大表的数据,这个方法将比直接读日志文件要快得多。
利用备份来恢复被误删除的数据。如果你定期进行数据库备份,恢复误删数据时可以使用备份数据来进行还原。这种方法的缺点是可能导致数据不够实时,需要考虑备份的时间间隔和数据的重要程度。
利用第三方工具。有一些第三方工具可以帮助您恢复被误删除的数据,例如UndeleteMySQL等工具。这些工具有时会收费,但可以减轻人工还原带来的工作量和风险。
我建议你考虑使用第一种方法,同时关注备份策略的制定和实施,避免数据的不可逆丢失。
另外,如果您需要频繁进行数据恢复工作,建议您考虑设计更好的数据库备份和恢复策略,以减少数据的不必要丢失和恢复的风险。
如果您还有其他问题或疑惑,请继续追问。
这都是血的教训 为什么不备份?
查看binlog日志是否开启 如果没开启那恢复不了,只能第三方来恢复