Oracle误删除数据和表的恢复办法包括truncate
在工作中我们操作数据库的时候经常会发生一个不该发生的问题:用户意外的删除一个非常重要的表或者是表中的数据而且没有备份,需要尽快的恢复,以下就是解决的办法:
主要是利用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的更多相关文章
- oracle查询某张表的外键,并用 truncate 命令有外键的表中的数据
注:本文来源于<oracle查询某张表的外键(最终解决办法)> 一:几个查询表外键的脚本 select b.table_name, b.column_name from user_cons ...
- Oracle添加数据文件创建表空间,创建用户代码
1,添加数据文件创建表空间 CREATE TABLESPACE "TEST1" DATAFILE 'D:\ORACLE\11G\ORADATA\ORCL\TEST1.DBF' SI ...
- oracle误删除数据的恢复方法
学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案. 今天主要以oracle数据库 ...
- Oracle误删除数据的恢复方法(转)
来源:原创网站北京北亚数据恢复中心,转载须注明出处. 学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些 ...
- oracle 误删除数据,回退表数据
select * from sh_gonghuo_renyuan as of timestamp to_timestamp('2017-11-17 16:00:00','yyyy-mm-dd hh24 ...
- oracle删除数据后表空间仍过大问题解决方法
-----亲测有效------- --一.备份原始数据库库--1.备份空表--在plsql里面执行一下这句话 然后把结果集 再执行一把 再导数据select 'alter table '||table ...
- Oracle索引梳理系列(一)- Oracle访问数据的方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle误删除表数据后的恢复具体解释
Oracle误删除表数据后的恢复具体解释 測试环境: SYSTEM:IBM AIX 5L Oracle Version:10gR2 1. undo_re ...
- Linux环境下利用句柄恢复Oracle误删除的数据文件
在误删除Oracle的数据文件后,如果未关闭数据库,文件句柄还没有释放,且被删除的数据文件占用的磁盘块未被复写,则可以利用句柄的方式来恢复数据文件.下面模拟恢复过程. (一)环境 OS版本:redha ...
随机推荐
- git 的详解
https://blog.csdn.net/youzhouliu/article/details/78952453
- 【JAVA】servlet执行流程
servlet执行流程 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request.respon ...
- 将多窗体应用程序改造为仿Chrome形式的简易方法
需求 在我们现有的ERP应用中,他是基于WinForm设计的,在早期的设计中,我们每打开一个作业,就会新建一个窗口,就像这样: 当我们打开很多的作业时,用户要通过Windows的任务栏慢慢找到,当然, ...
- Json 数组传值
1. var _content = {}; _content[_title] = _oldValue + ' -- > ' + statusVal; 2. var eventData = { T ...
- IntelliJ IDEA2018.3 最新破解方法
IntelliJ IDEA2018.3 最新破解方法 输入 http://idea.java.sx/ 即可,亲测可用.如果资金允许还是希望大家能支持正版,尊重原创 ------------- ...
- raid卡的结构示意图
raid卡的结构示意图,取自<大话存储>第124页 ROM:一般用FLash芯片做ROM,存放着初始化RAID卡必须的代码以及实现RAID功能所需的代码; XOR芯片:专门用来做RAID ...
- chrome google plugins
Advanced REST client Axure RP Extension for Chrome Charset Chrono下载管理器 Code Cola CSS Sprite Gen ...
- php中微信开发的转发分享
简单来说 ,一共四步 1. 微信公众平台中公众号设置”的“功能设置”里填写“JS接口安全域名”.该域名填写你的项目的域名. 2. 下载jssdk的damo,https://mp.weixin.qq ...
- elk的一些零碎知识
1.elasticsearch检查是否健康 http://12.20.511.141:9200/_cat/health?v 绿色表示一切正常, 黄色表示所有的数据可用但是部分副本还没有分配,红色表示部 ...
- lnamp环境搭建博客、论坛
实验环境:Centos6.5 源码安装Nginx yum安装Apache.php.Mysql Mysql: yum -y install mysql-server 安装Mysql数据库 /etc/i ...