在工作中我们操作数据库的时候经常会发生一个不该发生的问题:用户意外的删除一个非常重要的表或者是表中的数据而且没有备份,需要尽快的恢复,以下就是解决的办法:

主要是利用Oracle回收站的闪回特性oracle 回收站recyclebin是10g才有的新特性,当我们drop table cube_scope 【purge】时,如果不指定purge时,系统只是将这个表重命名为BIN$开头的名称,并在数据字典中修改了相关数据,表所占用的物理空间并没有真正的回收,此时所占用的空间还是原来的表空间,当表空间不够用时,ORACLE会跟据DROPSCN#自动进行逐个清理回收站中对像所占用的空间,10g默认是打开回收站功能的。

一、delete 数据 误删除

1、 删除数据之后表结构没有变化

直接使用表闪回,表闪回要求用户必须要有flash any table权限

先确定删除数据的时间(在删除数据之前的时间就行,不过最好要具体到删除数据的时间点)

alter  table 表名 enable row  movement    //开启行移动功能

flashback table 表名 to timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss')

//恢复数据到删除时间点之前的状态

Alter table 表名 disable row movement      //关闭行移动功能(一定不能忘记)

2、 删除数据之后表结构发生了变化

select * from 表名 as of timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss')

//找出被删除的数据

insert into 表名 (select * from 表名 as of timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss'));     //把删除的数据重新插回原表,但注意主键不要重复

二 、drop命令 删除表

由于oracle在删除表时,没有直接清空表所占的块,oracle把这些已删除的表的信息放到了一个虚拟容器“回收站”中,而只是对该表的数据块做了可以被覆写的标志,所以在块未被重新使用前还可以恢复。

查看回收站中的表

select object_name,original_name,partition_name,type,ts_name,createtime,droptimefrom recyclebin;

可以看到被删除的表在回收站被命名为’BIN$0z+2cCjdSjqkx1nsP/re7w==$0’

flashback table 原表名 to before drop (rename to 新表名)   //闪回原表(重命名新表名)

或者

flashback table "回收站中的表名(如:BIN$0z+2cCjdSjqkx1nsP/re7w==$0)" to before drop (rename to 新表名)  //用户可能会经常多次创建和删除同一个表就需要找到回收站的表名闪回相应的表版本

但是用这种方法只是把我们的表给找回来了,我们的索引和约束都没有回来。所以我们一定要重新建立索引和约束。如果

oracle 闪回功能还可以闪回整个数据库,使数据库回到过去某一状态。

alter database flashback on

flashback database to scn SCNNO;     //使用SCN号闪回或者使用时间戳闪回

flashback database to timestamp to_timestamp('2007-10-25 12:00:00','yyyy-mm-dd hh24:mi:ss');

如果想要不经过回收站直接删除并释放所占空间

drop table 表名 purge  //此命令相当于truncate+drop 操作,一般不建议这么做。

手工清除回收站中的对象。

prug table 表空间.表名     //清除具体的对象

prug tablespace  表空间    //清除指定的表空间对象

purge tablespace 表空间 user 用户名  //删除表空间指定用户下的所有对像

purge recyclebin    //删除回收站

purge dba_recyclebin    //删除全体用户在回收站的数据

ORACLE空间利用原则

1. 使用现有的表空间的未使用空间

2. 如果没有了空闲空间,则检查回收站,对于回收站的对象按照先进先出的原则,对于最先删除的对象,oracle在空间不足之时会最先从回收站删除以满足新分配空间的需求

3. 如果回收站也没有对象可以清理,则检查表空间是否自扩展,如果自扩展则扩展表空间,然后分配新空间

4.如果表空间非自扩展,或者已经不能自扩展(到达最大限制),则直接报表空间不足错误,程序终止

* drop tablespace :会将recyclebin中所有属于该tablespace的对像清除

* drop user :会将recyclebin中所有属于该用户的对像清除

* drop cluster : 会将recyclebin中所有属于该cluster的成员对像清除

* drop type : 会将recyclebin中所有依赖该type对像清除

另外还需要注意一种情况,对像所在的表空间要有足够的空间,不然就算drop掉经过recyclebin由于空间不足oracle会自动删除的哦(切记)!

三、truncate删除数据

1、使用闪回特性

因为truncate不是DML语句,是DDL语句,不能使用闪回查询的方式恢复表数据,这里介绍一种通过flashback database(闪回整个数据库)的方式恢复数据的方法。

在11g下,可以在mount和open模式来执行该命令

select status from v$instance;   查看数据库模式

alter database open;  //或者是mount

alter database flashback on

flashback database to timestamp to_timestamp('2007-10-25 12:00:00','yyyy-mm-dd hh24:mi:ss');

在执行完flashback database 命令之后,可以使用多种方式修复数据库:

1). 直接alter database open resetlogs 打开数据库,指定scn 或者timestamp 时间点之后产生的数据统统丢失。

2). 先执行alter database open read only 命令以read-only 模式打开数据库,查看恢复后的数据是否满足要求,如果满足要求,则通过resetlogs打开数据库,否则,重新执行flashback 操作。

3). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

这里演示第二种方法

alter database open read only;

查看数据是否符合要求不符合继续flashback database to timestamp to_timestamp

如果符合

startup mount force

alter database open resetlog;

 

 

 

第三种方法

闪回之后 alter database open read only

exp  用户名/用户密码 file=t.dmp tables=表名;  //导出被truncate表的数据  如果不熟悉exp命令的话,可以去看exp/expdp 与 imp/impdp命令导入导出数据库详解

shutdown immediate  //重启数据库恢复到闪回之前的时间点

startup mount;

recover database;

alter database open;

然后导入刚才导出的数据

imp 用户名 /密码  file=t.dmp tables=表名 ignore=y;

转载自:https://www.cnblogs.com/lk-fxtx/p/7739805.html

转载于:https://www.cnblogs.com/zhangyuanbo/p/11208064.html

Oracle误删除数据和表的恢复办法包括truncate相关推荐

  1. Oracle误删除数据的恢复方法

    Oracle误删数据的恢复,分为两种方法:SCN和时间戳两种方法恢复. 一.通过SCN恢复删除且已提交的数据 1.获得当前数据库的SCN号 select current_scn from v$data ...

  2. oracle误删除一条数据库,Oracle误删除数据的恢复方法

    Oracle误删数据的恢复,分为两种方法:SCN和时间戳两种方法恢复. 一.通过SCN恢复删除且已提交的数据 1.获得当前数据库的SCN号 select current_scn from v$data ...

  3. oracle备份的输出日志文件,oracle导出数据,备份及恢复数据,及数据库日志文件的查看...

    以salary为例,在PLSQL Developer中操作 1.导出salary表的数据:将 salary 表的数据以 insert 语句的方式导出 tools-->Export Tables- ...

  4. linux 误删除mysql表能恢复吗_Linux下Oracle误删除数据文件恢复操作

    检查数据文件的位置如下: SQLgt; select name from v$datafile; NAME----------------------------------------------- ...

  5. Oracle误删除数据的恢复方法(转)

    来源:原创网站北京北亚数据恢复中心,转载须注明出处. 学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些 ...

  6. ORACLE 数据、表误删恢复(转)

    今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法.(不考虑全库备份和利用归档日志) 删除表中数据有三种方法: ·delete(删除一条记录) ·drop或truncate删除表格中数据 ...

  7. linux oracle删除恢复数据恢复,Linux下Oracle误删除数据文件恢复操作

    检查数据文件的位置如下: SQL> select name from v$datafile; NAME --------------------------------------------- ...

  8. oracle误删除数据,恢复删除的数据,删除数据后提交恢复

    今天下午在工作的时候,一个不小心,把搞了好久的一张表的某条记录给误删了,忙了将近一天才弄好的一条记录啊(BLOB字段,不要问我是什么...).于是网上查吧,还真找到了,嘿嘿. select * fro ...

  9. oracle 12c rac tablespace 表空间删除办法

    文章来源: 原创adler_cn,大路 场景展示: 通过在某一台node节点上执行shell 脚本,正常会同步到其他node节点上,事实并不是如此,我们发现执行完脚本之后,RAC服务器上生成的tabl ...

最新文章

  1. Kafka:你必须要知道集群内部工作原理的一些事!
  2. H264分辨率解码概述
  3. 【JQuery】 触发元素的change事件
  4. IT民工系列——c#控制Word的类库。对com操作进行了封装
  5. 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
  6. 团队管理21--梯队培养
  7. 陶哲轩论文解析:从特征值到特征向量
  8. 少儿编程c语言 难度,c语言很难学吗
  9. 传统产业要向数字化转型发力
  10. 工业品B2B平台5大要诀,降低企业采购成本捷径
  11. 神经科学界大地震!诺奖级泰斗将携团队移居中国,与蒲慕明院士强强联手
  12. nginx:代理服务器(涉及upstream)的例子
  13. HTML和CSS内容总结
  14. 习题 于歆杰 电路_清华大学 电路原理 于歆杰 60讲视频教程
  15. 齐二TK6916/20/26/32系列数控落地铣镗床简介6
  16. office2016激活後显示是激活的状态,打开后还是提示激活:“让我们开始”
  17. cmake:通过CMAKE_CXX_COMPILE_FEATURES判断编译器是否支持C++11
  18. 一个从阿里面试回来的程序员的感想
  19. proe转cad后尺寸改变了怎么办
  20. 【Linux】Linux网络编程(含常见服务器模型,上篇)

热门文章

  1. 在hibernate中使用c3p0数据源
  2. 高效率开发必备!!!!
  3. PS5穿越云层3D文字
  4. 胜任素质--哈佛大学教授麦克里兰 (McClelland)有效地预测外交官实际工作业绩的人员选拔方法...
  5. 如何安装OpenCV?如何安装cv2?如何更新numpy?
  6. 3d相册 html 代码_HTML5 3D立体图片相册
  7. elinput内容过长显示悬浮框_element ui el-table 表头自定义,内容超出省略,悬浮时显示...
  8. sql取最大值的那一行_从零学会SQL:SQL高级功能
  9. openssh windows_WINDOWS环境配置SSH服务
  10. 列标题 如何删除gridcontrol_DEV控件GridControl常用属性设置(转)