• Oracle 误删表后数据恢复操作


    背景

    使用navicat导出数据库脚本文件后,每个表的前面都是 drop 语句,直接把表删了重建。但是这个往往问题很多,在新的用户下,没有这个表执行drop语句会报错,顶多用来做数据备份脚本。
    前段时间,想导出sql脚本到新的用户下执行的时候,操作错误,直接在导出sql的用户下执行语句,反应过来的时候已经有部分表被drop了,所以特地学习了一下 oracle 中 drop 语句的数据恢复方法。

    oracle数据恢复的原理

    oracle在删除表时,不会将全部数据从磁盘上全部去除,而是放置到回收站中

    操作步骤

    1. 执行查看全部删除记录语句
    select object_name,original_name,type,droptime from user_recyclebin;
    
    • 1

    object_name是删除表后的表名

    这个语句执行之后,可以看到回收站可恢复的删除记录,仔细看被删除的表,先找到自己删除的时间节点,再做筛选操作。

    1. 筛选出自己的删除记录
      时间可以直接复制上面的droptime的字符串
    select object_name,original_name,type,droptime from user_recyclebin where droptime >= '2022-9-16 09:00:00';
    
    • 1
    1. 如果记得表名,可直接通过表名来恢复
    flashback table 原表名 to before drop;
    
    • 1
    1. 如果不记得了,可通过object_name来恢复
    flashback table "这里是object_name" to before drop rename to 新表名;
    
    • 1

    直接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');
    
    • 1
    • 2
    • 3

    注意事项

    闪回数据时,千万不能新建同名的表然后删除!回收站的记录会被覆盖的!
    举例子说明:原先有个名字叫A的表,里面有大量的数据,你突然手抖了,把这个表drop了。你当时没看到这篇文章时,不知道数据可以恢复,自己又建了一个同名的A表。你看到这篇文章后知道可以恢复了,但是前面你在恢复操作时,提示你已经有名称为A的表了,然后这个时候你去把现有的空记录的A表一删,他会把回收站的A表的数据覆盖掉了!你再去恢复的时候,就是你刚删的空记录的A表,你的数据彻底丢失了!

    参考文章

    链接直达:https://www.cnblogs.com/yfdfj/p/15157224.html

  • 相关阅读:
    AIGC技术:发展、应用与前景
    C++使用pybind11编译动态库出错
    图问题——深度遍历,广度遍历,并查集
    IDEA创建父子项目
    Gradle之属性Properties
    Python学习----函数
    特征交叉系列:FM和深度神经网络的结合,DeepFM原理简述和实践
    如何将Python写的代码打包成.exe可执行文件
    【附源码】计算机毕业设计SSM商品推荐系统
    声网首席科学家钟声:感知实时互联网
  • 原文地址:https://blog.csdn.net/interestANd/article/details/126891851