背景
使用navicat导出数据库脚本文件后,每个表的前面都是 drop 语句,直接把表删了重建。但是这个往往问题很多,在新的用户下,没有这个表执行drop语句会报错,顶多用来做数据备份脚本。
前段时间,想导出sql脚本到新的用户下执行的时候,操作错误,直接在导出sql的用户下执行语句,反应过来的时候已经有部分表被drop了,所以特地学习了一下 oracle 中 drop 语句的数据恢复方法。
oracle数据恢复的原理
oracle在删除表时,不会将全部数据从磁盘上全部去除,而是放置到回收站中
操作步骤
- 执行查看全部删除记录语句
select object_name,original_name,type,droptime from user_recyclebin;
object_name是删除表后的表名
这个语句执行之后,可以看到回收站可恢复的删除记录,仔细看被删除的表,先找到自己删除的时间节点,再做筛选操作。
- 筛选出自己的删除记录
时间可以直接复制上面的droptime的字符串
select object_name,original_name,type,droptime from user_recyclebin where droptime >= '2022-9-16 09:00:00';
- 如果记得表名,可直接通过表名来恢复
flashback table 原表名 to before drop;
- 如果不记得了,可通过object_name来恢复
flashback table "这里是object_name" to before drop rename to 新表名;
直接flashback数据库到某一个时间点
通过上面的操作步骤可以一个表一个表地恢复数据,其实也有直接将数据库闪回到某一时间点的。但是这个执行语句,开发人员不一定有权限。
alter database flashback on;
flashback database to scn tmp_db1;
flashback database to timestamp to_timestamp('2017-6-28 11:30','yyyy-mm-dd hh24:mi:ss');
注意事项
闪回数据时,千万不能新建同名的表然后删除!回收站的记录会被覆盖的!
举例子说明:原先有个名字叫A的表,里面有大量的数据,你突然手抖了,把这个表drop了。你当时没看到这篇文章时,不知道数据可以恢复,自己又建了一个同名的A表。你看到这篇文章后知道可以恢复了,但是前面你在恢复操作时,提示你已经有名称为A的表了,然后这个时候你去把现有的空记录的A表一删,他会把回收站的A表的数据覆盖掉了!你再去恢复的时候,就是你刚删的空记录的A表,你的数据彻底丢失了!