oracle误删数据后进行恢复

一、delete 数据 误删除

select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’)from dual;
flashback table ods_job_state_ycl to timestamp to_timestamp(‘2019-03-21 18:21:59’,‘yyyy-mm-dd hh24:mi:ss’);
alter table ods_job_state_ycl enable row movement //开启行移动功能
Alter table ods_job_state_ycl disable row movement /// //关闭行移动功能(一定不能忘记)

–闪回到15分钟前
select * from orders as of timestamp (systimestamp - interval ‘‘15’’ minute) where …
这里可以使用DAY、SECOND、MONTH替换minute,例如:
SELECT * FROM orders AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL ‘‘2’’ DAY)
–闪回到某个时间点
select * from orders as of timestamp to_timestamp (’‘01-Sep-04 16:18:57.845993’’, ‘‘DD-Mon-RR HH24:MI:SS.FF’’) where …

–闪回到两天前
select * from orders as of timestamp (sysdate - 2) where…

/2.FLASHBACK DROP/

1.flashback table orders to before drop;

2.如果源表已经重建,可以使用rename to子句:
flashback table order to before drop rename to order_old_version;

/3.FLASHBACK TABLE/

1.首先要启用行迁移:
alter table order enable row movement;
2.闪回表到15分钟前:
flashback table order to timestamp systimestamp - interval ‘‘15’’ minute;
闪回到某个时间点:
FLASHBACK TABLE order TO TIMESTAMP TO_TIMESTAMP(‘2007-09-12 01:15:25 PM’,‘YYYY-MM-DD HH:MI:SS AM’)

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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值