Oracle—数据恢复

本文介绍了Oracle的数据恢复方法。从10g开始引入回收站机制,它是逻辑区域,与表空间对象共用存储。可查询、开启或关闭回收站,不过会占用空间,可通过truncate或drop加purge选项回收。还介绍了undo恢复(闪回),能通过闪回查询确定删除前记录并恢复已提交的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1、recyclebin(回收站)

     从ORACLE 10g开始,引入了一个叫回收站(RecycleBin)的概念,全称为Tablespace Recycle Bin。回收站实际是一个逻辑区域,它以表空间中现有已经分配的空间为基础,而不是从表空间上物理划出一个固定区域用作回收站。这意味着回收站和表空间中的对象共用存储区域、系统没有给回收站预留空间。

       当表被DROP后,如果可用空间充足,并且没有对回收站进行清理,那么被DROP掉的对象会一直存在回收站中,仍然会占用空间。但是如果可用空间紧张的情况下,数据库会根据先进先出的顺序覆盖Recycle Bin中的对象。所以回收站机制也不是百分百的保险机制。另外从原理上来说它就是一个数据字典表,放置用户Drop掉的数据库对象信息。

1.1、查询回收站是否开启:

方法一:show parameter recyclebin

show parameter recyclebin;

 方法二:sql语句查询

select t.NAME, t.VALUE, t.DISPLAY_VALUE
  from v$parameter t
 where t.NAME = 'recyclebin';

运行结果:

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on
——————————————————————————

1.2、开启|关闭回收站:

回收站的开启和关闭可以按照时效分为会话级别和系统级别;

1.2.1、会话级别(session)

alter session set recyclebin=on/off;

1.2.2、系统级别(System)

alter system set recyclebin=on/off;

1.2.3、对象查找

select owner,
       object_name,
       original_name,
       operation,
       type,
       ts_name,
       createtime,
       droptime,
       dropscn,
       partition_name,
       can_undrop,
       can_purge,
       related,
       base_object,
       purge_object,
       space
  from DBA_RECYCLEBIN t
 where t.owner = '&username'
 order by t.createtime desc;

1.3、示例

1、创建测试数据

-- 创建测试表
create table A
(
  id      VARCHAR2(20),
  name    VARCHAR2(20),
  address VARCHAR2(20)
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- 插入数据
insert into A (ID, NAME, ADDRESS)
values ('1', '1', '1');
 
insert into A (ID, NAME, ADDRESS)
values ('2', '2', '2');
 
commit;

2、删除表

drop table A;

3、查询回收站

select * from user_recyclebin;

执行结果:

恢复表:

flashback table A to before drop;

1.4、总结:

oracle提供以上机制保证了安全操作,但同时也代来了另外一个问题,就是空间占用,由于以上机制的运行,使用drop一个表或者delete数据后,空间不会自动回收,对于一些确定不使用的表,删除时要同时回收空间,可以有以下2种方式:

1、采用truncate方式进行截断。(但不能进行数据回恢复了)

2、在drop时加上purge选项:

drop table 表名 purge

该选项还有以下用途:
删除当前用户的回收站:

purge recyclebin;


删除全体用户在回收站的数据:
 

purge dba_recyclebin;

2、undo恢复(闪回)

2.1、通过闪回查询确定删除前的记录:

select * from 表名 as of timestamp to_timestamp('2023-07-26 17:00:50','yyyy-mm-dd hh24:mi:ss')

2.2、闪回操作:

flashback table 表名 to timestamp to_timestamp('2023-07-26 17:00:50','yyyy-mm-dd hh24:mi:ss');

2.2.3、示例

通过时间恢复删除且已提交的数据
 
1)查询当前系统时间

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;


2)查询删除数据的时间点之前的数据

-- 如果不是,则继续缩小范围
 select * from 表名 as of timestamp to_timestamp('2024-02-02 15:00:00','yyyy-mm-dd hh24:mi:ss');


 
3)恢复删除且已提交的数据


--恢复某个时间点的数据
flashback table 表名 to timestamp to_timestamp('2024-02-02 15:00:00','yyyy-mm-dd hh24:mi:ss');

-- 如果报错 则开启移动功能,然后再执行上述sql,最后关闭移动功能
--开启行移动功能
alter table 表名 enable row movement;
 
--关闭行移动功能
alter table 表名 disable row movement;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值