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

主要是利用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;

二 、使用FY_Recover_Data 包

FY_Recover_Data

基于码农的劣根性,这里附上参考地址,感兴趣的朋友可以去看看http://blog.chinaunix.net/uid-23284114-id-3754559.html

Oracle误删除数据和表的恢复办法包括truncate的更多相关文章

  1. oracle查询某张表的外键,并用 truncate 命令有外键的表中的数据

    注:本文来源于<oracle查询某张表的外键(最终解决办法)> 一:几个查询表外键的脚本 select b.table_name, b.column_name from user_cons ...

  2. Oracle添加数据文件创建表空间,创建用户代码

    1,添加数据文件创建表空间 CREATE TABLESPACE "TEST1" DATAFILE 'D:\ORACLE\11G\ORADATA\ORCL\TEST1.DBF' SI ...

  3. oracle误删除数据的恢复方法

    学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案. 今天主要以oracle数据库 ...

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

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

  5. oracle 误删除数据,回退表数据

    select * from sh_gonghuo_renyuan as of timestamp to_timestamp('2017-11-17 16:00:00','yyyy-mm-dd hh24 ...

  6. oracle删除数据后表空间仍过大问题解决方法

    -----亲测有效------- --一.备份原始数据库库--1.备份空表--在plsql里面执行一下这句话 然后把结果集 再执行一把 再导数据select 'alter table '||table ...

  7. Oracle索引梳理系列(一)- Oracle访问数据的方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  8. Oracle误删除表数据后的恢复具体解释

    Oracle误删除表数据后的恢复具体解释 測试环境: SYSTEM:IBM AIX 5L                         Oracle Version:10gR2 1. undo_re ...

  9. Linux环境下利用句柄恢复Oracle误删除的数据文件

    在误删除Oracle的数据文件后,如果未关闭数据库,文件句柄还没有释放,且被删除的数据文件占用的磁盘块未被复写,则可以利用句柄的方式来恢复数据文件.下面模拟恢复过程. (一)环境 OS版本:redha ...

随机推荐

  1. HTML5地理定位API在chrome中不能正常使用

    navigator.geolocation.getCurrentPosition在chrome中不能正常使用. 经测试发现,FQ后就能正常使用,估计是因为chrome 对这个API的实现使用了goog ...

  2. 一个SQL语句的优化(sqlserver)

    最早的写法: WITH T AS ( end as Flag FROM YM WHERE Col_076 BETWEEN '2018-07-25' AND '2018-08-03' AND Col_4 ...

  3. 用python代码模拟登录网站

    方法一:直接使用已知的cookie访问 特点: 简单,但需要先在浏览器登录 具体步骤: 1.用浏览器登录,获取浏览器里的cookie字符串 先使用浏览器登录.再打开开发者工具,转到network选项卡 ...

  4. Xshell利用lrzsz工具上传下载

    直接安装这个lrzsz工具 yum install lrzsz 上传 rz 下载 sz

  5. SQL运行优化收藏

    如何让你的SQL运行得更快(转贴) ---- 人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境 ...

  6. OO的奇妙冒险——OOP入门与字符串处理

    OO的奇妙冒险 ~OOP入门与字符串处理~ 总体分析 公测 中测(基础与进阶): 其实在我看来,从完成作业的角度来说,中测的基础与进阶并没有任何区别,都不能挂,都不太难,都对得分没有什么影响.中测的样 ...

  7. 运用jieba库 寻找高频词

    一.准备 1.首先 先用cmd 安装 jieba库,输入 pip install jieba 2.其次 本次要用到wordcloud库和 matplotlib库,也在cmd输入pip install ...

  8. DMA 内存存取原理

    DMA直接内存存取原理 DMADMA直接内存存取原理是指外部设备不通过CPU而直接与系统内存交换数据的接口技术. 要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程 ...

  9. UVa LA 4636 Cubist Artwork 难度: 0

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  10. emacs技巧

    Table of Contents "ctrl space"设置mark 同时在选中的各行行首添加相同内容 寄存器 跳转到某行 删除光标所在的空格和TAB或空白行 把TAB全部转换 ...