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;