oracle10g之后引入闪回技术,闪回技术是这样处理的,当一个表被删除时,它并不是真的被删除,而只是被放到了回收站(recyclebin)里,只要这表还在回收站里,它就可以被闪回回来。该回收站被放在表所在表空间,oracle并不保证所有删除的表都能闪回成功。因为当用户在某个表空间上创建新表(或需要磁盘空间)时,oracle首先使用空闲磁盘空间,如果没有足够的磁盘空间,oracle将使用回收站的磁盘空间。
要使用闪回技术,需修改系统参数recyclebin为ON
SQL> show parameters recyclebin
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
recyclebin string on
如果不是为ON,使用alter system修改需加入deferred,当前session不生效
SQL> alter system set recyclebin=off deferred;
System altered.
使用alter session 修改当前session生效,其它不生效
SQL>
SQL> alter session set recyclebin=on;
Session altered.
SQL> show parameter bin
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
cursor_bind_capture_destination string memory+disk
recyclebin string ON
扩展:如想查询参数文件用alter session 还是 alter system 查询V$PARAMETER动态视图,
isses_modifiabl列两个可选值
是否可以使用ALTER SESSION
1.可以(TRUE
)
2.不可以(FALSE
)
issys_modifiable列三个可选值
1.IMMEDIATE
- ALTER SYSTEM
无论用于启动实例的参数文件类型如何,都可以更改参数。更改立即生效。
2.DEFERRED
- ALTER
SYSTEM
无论用于启动实例的参数文件类型如何,都可以更改参数。此更改将在后续会话中生效。
3.FALSE
- ALTER SYSTEM
除非使用服务器参数文件来启动实例,否则无法更改参数。更改将在后续实例中生效。
SQL> select name ,isses_modifiable,issys_modifiable from v$parameter where name like 'recyclebin';
NAME ISSES_MODI ISSYS_MODIFIABLE
---------------------------------------- ---------- ------------------
recyclebin TRUE DEFERRED
查询回收站中的内容
SQL> show recyclebin
ts_name代表表空间名,space回收站中这个被删除的表所使用的磁盘空间为多少个数据块
SQL> select object_name,ts_name,space from user_recyclebin;
连接hr用户,创建t1表,删除t1表,查询回收站
SQL> create table t1 as select * from jobs;
Table created.
SQL> select table_name from user_tables;
TABLE_NAME
----------------------------------------
REGIONS
COUNTRIES
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
T1
8 rows selected.
SQL> drop table t1;
Table dropped.
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T1 BIN$cKe1roAHJgzgU4GzEKx4YQ==$0 TABLE 2018-07-10:23:23:18
SQL> select object_name,ts_name,space from user_recyclebin;
OBJECT_NAME
------------------------------------------------------------------------------------------------------------------------
TS_NAME SPACE
------------------------------------------------------------ ----------
BIN$cKe1roAHJgzgU4GzEKx4YQ==$0
USERS 8s
查询t1表,已经不在了,报错。闪回t1表,再次查询t1表,已经闪回成功
SQL> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> flashback table t1 to before drop;
Flashback complete.
SQL> select * from t1 where rownum < 2;
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
-------------------- ---------------------------------------------------------------------- ---------- ----------
AD_PRES President 20080 40000
删除回收站中的某个表
SQL> drop table t1;
Table dropped.
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T1 BIN$cKe1roAJJgzgU4GzEKx4YQ==$0 TABLE 2018-07-10:23:33:12
SQL> purge table t1;
Table purged.
SQL> show recyclebin
SQL>
清空回收站
SQL> purge recyclebin;
Recyclebin purged.
如果删除一个表时就不想放入回收站可以在drop语句之后加上purge
SQL> drop table t1 purge;
闪回技术只能保护非系统(non-SYSTEM)表空间中的表,而且这些表还必须存放在本地管理的表空间中。尽管在一个表被删除时,依赖于该表的绝大多数对象也受到回收站的保护,但是位图连接索引、引用完整性约束等不受到回收站的保护。