回收站中表名的含义:(格式: BIN$globalUID$version)
BIN: 表示 RECYCLEBIN
globalUID: 是一个全局唯一的, 24 个字节,该标识与原对象名没有任何关系
version: 指数据库分配的版本号。
闪回删除利用的是recyclebin回收站,闪回删除特指是drop操作,drop后的表实际上是存放在recyclebin里的,
还是可以对删除后的表进行查询操作(基于回收站);但是注意:当表空间用满或设置为自动扩展了,
但对于要扩张表空间首先会侵占回收站的空间,这就导致回收站内的数据彻底丢失.
回收站采用后进先出原则;假设当t表被drop后,有建了一新的同名t表,则flashback table就必须要重命名rename回收站的老t表了
当然也可以指定回收站内的表明(特指在回收站内新生成的名字)进行flashback table操作;
一.测试闪回删除
SYS@PROD1>create user test identified by oracle default tablespace users;
User created.
1.准备环境(创建测试表t,索引idx_t,触发器 trg_t)
SYS@PROD1>create user test identified by oracle default tablespace users;
User created.
SYS@PROD1>grant connect,resource to test;
Grant succeeded.
TEST@PROD1>ed 001
create or replace trigger trg_t
before insert on t
for each row
begin
if :new.d is null then
:new.d:=sysdate;
end if;
end;
/
TEST@PROD1>@001
Trigger created.
2.删除测试表t,验证已进入回收站
TEST@PROD1>drop table t;
Table dropped.
TEST@PROD1>select tname,tabtype from tab;
TNAME TABTYPE
------------------------------ -------
BIN$RFFtUXQvQX3gUwsKqMAtXw==$0 TABLE
只看到了表,没有看到表关联的索引、触发器,再利用user_recyclebin查询
TEST@PROD1>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$RFFtUXQvQX3gUwsKqMAtXw==$0 TABLE 2016-12-23:17:58:25
TEST@PROD1>col ORIGINAL_NAME for a20;
TEST@PROD1>col OBJECT_NAME for a50;
TEST@PROD1>col TYPE for a20;
TEST@PROD1>col DROPTIME for a30;
TEST@PROD1>set linesize 100;
TEST@PROD1>select ORIGINAL_NAME,OBJECT_NAME,TYPE,DROPTIME from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE
-------------------- -------------------------------------------------- --------------------
DROPTIME
------------------------------
TRG_T BIN$RFFtUXQuQX3gUwsKqMAtXw==$0 TRIGGER
2016-12-23:17:58:25
T BIN$RFFtUXQvQX3gUwsKqMAtXw==$0 TABLE
2016-12-23:17:58:25
IDX_T BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 INDEX
2016-12-23:17:58:25
3.对删除的表进行闪回,闪回成功后,回收站已经没有测试表的记录
TEST@PROD1>flashback table t to before drop;
Flashback complete.
TEST@PROD1>select OBJECT_NAME,ORIGINAL_NAME,TYPE,DROPTIME from user_recyclebin;
no rows selected
4.查看闪回的表相关对象的状态
通过以下查询,发现以下两个问题:
1:触发器的状态为失效的
2:对象名称,除表名以外,其他的都已不是原来的名称。
TEST@PROD1>col OBJECT_NAME for a30;
TEST@PROD1>select object_name,object_type,status from user_objects;
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 INDEX VALID
BIN$RFFtUXQuQX3gUwsKqMAtXw==$0 TRIGGER INVALID
T TABLE VALID
5.重新编译触发器,并重命名触发器
TEST@PROD1>alter trigger "BIN$RFFtUXQuQX3gUwsKqMAtXw==$0" compile;
Trigger altered.
TEST@PROD1>alter trigger "BIN$RFFtUXQuQX3gUwsKqMAtXw==$0" rename to trg_t;
Trigger altered.
TEST@PROD1>select object_name,object_type,status from user_objects;
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 INDEX VALID
TRG_T TRIGGER VALID
T TABLE VALID
6.再次删除t表
TEST@PROD1>set linesize 100;
TEST@PROD1>select original_name,object_name,type from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE
------------------------------ ------------------------------ -------------------------
BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 BIN$RIeZ/j1ZROvgUwsKqMCbEA==$1 INDEX
TRG_T BIN$RIeZ/j1aROvgUwsKqMCbEA==$0 TRIGGER
T BIN$RIeZ/j1bROvgUwsKqMCbEA==$0 TABLE
创建一张新的 t 表(包含两个字段,目的是将 t 的对象名称占用上)
TEST@PROD1>flashback table t to before drop;
flashback table t to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
TEST@PROD1>flashback table t to before drop rename to t_old;
Flashback complete.
验证回收站:(无显示,即为无表在回收站内)
XX@ORA11GR2>show recyclebin;
二.实验回收站之后进先出原则
如回收站中存在两个(以上) 相同的源表名,则闪回时总是闪回最近的版本,如果闪回特定
的表,需要指定该表在回收站中的名称。 测试如下:
1.创建表 hehe,创建三次,删除三次,第一次一个字段,第二次两个字段,第三次三个字段
TEST@PROD1>create table test1(x1 int);
Table created.
TEST@PROD1>drop table test1;
Table dropped.
TEST@PROD1>create table test1(x1 int,x2 int);
Table created.
TEST@PROD1>drop table test1;
Table dropped.
TEST@PROD1>create table test1(x1 int,x2 int, x3 int);
Table created.
TEST@PROD1>drop table test1;
Table dropped.
2.查看回收站
TEST@PROD1>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1 BIN$RIeZ/j1eROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:58:05
TEST1 BIN$RIeZ/j1dROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:56:03
TEST1 BIN$RIeZ/j1cROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:55:34
TEST@PROD1>SELECT original_name, object_name FROM user_recyclebin where original_name='TEST1';
ORIGINAL_NAME OBJECT_NAME
------------------------------ ------------------------------
TEST1 BIN$RIeZ/j1cROvgUwsKqMCbEA==$0
TEST1 BIN$RIeZ/j1dROvgUwsKqMCbEA==$0
TEST1 BIN$RIeZ/j1eROvgUwsKqMCbEA==$0
3.闪回test1表,我们查看返回后的test1表,发现为最后删除的、包含三个字段的test1表
TEST@PROD1>flashback table test1 to before drop;
Flashback complete.
TEST@PROD1>desc test1;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
X1 NUMBER(38)
X2 NUMBER(38)
X3 NUMBER(38)
4.现在回收站中还有两个test1表,要求闪回包含一个字段的test1表,并且重命名为test1_old
TEST@PROD1>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1 BIN$RIeZ/j1dROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:56:03
TEST1 BIN$RIeZ/j1cROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:55:34
TEST@PROD1>
TEST@PROD1>
TEST@PROD1>desc "BIN$RIeZ/j1cROvgUwsKqMCbEA==$0";
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
X1 NUMBER(38)
进行闪回操作
TEST@PROD1>flashback table "BIN$RIeZ/j1cROvgUwsKqMCbEA==$0" to before drop rename to test1_old;
Flashback complete.
TEST@PROD1>desc test1_old;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
X1 NUMBER(38)
三.清空回收站
1.将整个表空间的回收站内容全部清空
TEST@PROD1>purge tablespace users;
Tablespace purged.
2.清空某个表空间上某个用户回收站中的对象
TEST@PROD1>purge tablespace users user test;
Tablespace purged.
3.清空当前用户下回收站
TEST@PROD1>purge recyclebin;
Recyclebin purged.
4.当以DBA身份登录时,可以清空所有表空间上回收站
SYS@PROD1>purge dba_recyclebin;
DBA Recyclebin purged.
SYS@PROD1>purge recyclebin;
Recyclebin purged.
回收站注意事项:
闪回删除不适用于:
驻留在 SYSTEM 表空间中的表
使用细粒度级审计或虚拟专用数据库的表
驻留在字典管理表空间中的表
已清除的表,无论是手动清除的,还是在空间压力下自动清除的
以下相关对象不受保护:
位图联接索引
实体化视图日志
引用完整性约束条件
在删除表前删除的索引
1.使用system表空间的表,删除不进入回收站
TEST@PROD1>create table ha tablespace system as select 1 as x from dual;
Table created.
TEST@PROD1>select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
HA SYSTEM
TEST1 USERS
TEST1_OLD USERS
T USERS
T_OLD USERS
TEST@PROD1>drop table ha;
Table dropped.
TEST@PROD1>show recyclebin;
TEST@PROD1>select original_name,object_name,type,droptime from user_recyclebin;
no rows selected
不进回收站也就意味着无法闪回删除的使用system表空间的ha表
2.使用 vpd(Virtual Private Database)的表,删除不进入回收站
TEST@PROD1>ed 001
create or replace function fun_vpd_tab_lq(p_schema in varchar2,p_object in varchar2)
return varchar2 is
begin
return 'id<100';
end;
/
TEST@PROD1>@001
Function created.
SYS@PROD1>ed 002
begin
dbms_rls.add_policy (object_schema => 'test',
object_name => 'vpd_tab',
policy_name => 'p_vpd_tab_lq',
function_schema => 'test',
policy_function => 'fun_vpd_tab_lq');
end;
/
SYS@PROD1>@002
PL/SQL procedure successfully completed.
SYS@PROD1>select * from test.vpd_tab;
ID
----------
1
100
TEST@PROD1>select * from vpd_tab;
ID
----------
1
TEST@PROD1>select table_name,tablespace_name from user_tables where table_name='VPD_TAB';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
VPD_TAB USERS
TEST@PROD1>drop table vpd_tab;
Table dropped.
查看回收站
TEST@PROD1>show recyclebin;
TEST@PROD1>select original_name,object_name,type,droptime from user_recyclebin;
no rows selected
回收站不适用vpd(Virtual Private Database)的表
BIN: 表示 RECYCLEBIN
globalUID: 是一个全局唯一的, 24 个字节,该标识与原对象名没有任何关系
version: 指数据库分配的版本号。
闪回删除利用的是recyclebin回收站,闪回删除特指是drop操作,drop后的表实际上是存放在recyclebin里的,
还是可以对删除后的表进行查询操作(基于回收站);但是注意:当表空间用满或设置为自动扩展了,
但对于要扩张表空间首先会侵占回收站的空间,这就导致回收站内的数据彻底丢失.
回收站采用后进先出原则;假设当t表被drop后,有建了一新的同名t表,则flashback table就必须要重命名rename回收站的老t表了
当然也可以指定回收站内的表明(特指在回收站内新生成的名字)进行flashback table操作;
一.测试闪回删除
SYS@PROD1>create user test identified by oracle default tablespace users;
User created.
1.准备环境(创建测试表t,索引idx_t,触发器 trg_t)
SYS@PROD1>create user test identified by oracle default tablespace users;
User created.
SYS@PROD1>grant connect,resource to test;
Grant succeeded.
TEST@PROD1>ed 001
create or replace trigger trg_t
before insert on t
for each row
begin
if :new.d is null then
:new.d:=sysdate;
end if;
end;
/
TEST@PROD1>@001
Trigger created.
2.删除测试表t,验证已进入回收站
TEST@PROD1>drop table t;
Table dropped.
TEST@PROD1>select tname,tabtype from tab;
TNAME TABTYPE
------------------------------ -------
BIN$RFFtUXQvQX3gUwsKqMAtXw==$0 TABLE
只看到了表,没有看到表关联的索引、触发器,再利用user_recyclebin查询
TEST@PROD1>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$RFFtUXQvQX3gUwsKqMAtXw==$0 TABLE 2016-12-23:17:58:25
TEST@PROD1>col ORIGINAL_NAME for a20;
TEST@PROD1>col OBJECT_NAME for a50;
TEST@PROD1>col TYPE for a20;
TEST@PROD1>col DROPTIME for a30;
TEST@PROD1>set linesize 100;
TEST@PROD1>select ORIGINAL_NAME,OBJECT_NAME,TYPE,DROPTIME from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE
-------------------- -------------------------------------------------- --------------------
DROPTIME
------------------------------
TRG_T BIN$RFFtUXQuQX3gUwsKqMAtXw==$0 TRIGGER
2016-12-23:17:58:25
T BIN$RFFtUXQvQX3gUwsKqMAtXw==$0 TABLE
2016-12-23:17:58:25
IDX_T BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 INDEX
2016-12-23:17:58:25
3.对删除的表进行闪回,闪回成功后,回收站已经没有测试表的记录
TEST@PROD1>flashback table t to before drop;
Flashback complete.
TEST@PROD1>select OBJECT_NAME,ORIGINAL_NAME,TYPE,DROPTIME from user_recyclebin;
no rows selected
4.查看闪回的表相关对象的状态
通过以下查询,发现以下两个问题:
1:触发器的状态为失效的
2:对象名称,除表名以外,其他的都已不是原来的名称。
TEST@PROD1>col OBJECT_NAME for a30;
TEST@PROD1>select object_name,object_type,status from user_objects;
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 INDEX VALID
BIN$RFFtUXQuQX3gUwsKqMAtXw==$0 TRIGGER INVALID
T TABLE VALID
5.重新编译触发器,并重命名触发器
TEST@PROD1>alter trigger "BIN$RFFtUXQuQX3gUwsKqMAtXw==$0" compile;
Trigger altered.
TEST@PROD1>alter trigger "BIN$RFFtUXQuQX3gUwsKqMAtXw==$0" rename to trg_t;
Trigger altered.
TEST@PROD1>select object_name,object_type,status from user_objects;
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 INDEX VALID
TRG_T TRIGGER VALID
T TABLE VALID
6.再次删除t表
TEST@PROD1>set linesize 100;
TEST@PROD1>select original_name,object_name,type from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE
------------------------------ ------------------------------ -------------------------
BIN$RFFtUXQtQX3gUwsKqMAtXw==$0 BIN$RIeZ/j1ZROvgUwsKqMCbEA==$1 INDEX
TRG_T BIN$RIeZ/j1aROvgUwsKqMCbEA==$0 TRIGGER
T BIN$RIeZ/j1bROvgUwsKqMCbEA==$0 TABLE
创建一张新的 t 表(包含两个字段,目的是将 t 的对象名称占用上)
TEST@PROD1>flashback table t to before drop;
flashback table t to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
TEST@PROD1>flashback table t to before drop rename to t_old;
Flashback complete.
验证回收站:(无显示,即为无表在回收站内)
XX@ORA11GR2>show recyclebin;
二.实验回收站之后进先出原则
如回收站中存在两个(以上) 相同的源表名,则闪回时总是闪回最近的版本,如果闪回特定
的表,需要指定该表在回收站中的名称。 测试如下:
1.创建表 hehe,创建三次,删除三次,第一次一个字段,第二次两个字段,第三次三个字段
TEST@PROD1>create table test1(x1 int);
Table created.
TEST@PROD1>drop table test1;
Table dropped.
TEST@PROD1>create table test1(x1 int,x2 int);
Table created.
TEST@PROD1>drop table test1;
Table dropped.
TEST@PROD1>create table test1(x1 int,x2 int, x3 int);
Table created.
TEST@PROD1>drop table test1;
Table dropped.
2.查看回收站
TEST@PROD1>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1 BIN$RIeZ/j1eROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:58:05
TEST1 BIN$RIeZ/j1dROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:56:03
TEST1 BIN$RIeZ/j1cROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:55:34
TEST@PROD1>SELECT original_name, object_name FROM user_recyclebin where original_name='TEST1';
ORIGINAL_NAME OBJECT_NAME
------------------------------ ------------------------------
TEST1 BIN$RIeZ/j1cROvgUwsKqMCbEA==$0
TEST1 BIN$RIeZ/j1dROvgUwsKqMCbEA==$0
TEST1 BIN$RIeZ/j1eROvgUwsKqMCbEA==$0
3.闪回test1表,我们查看返回后的test1表,发现为最后删除的、包含三个字段的test1表
TEST@PROD1>flashback table test1 to before drop;
Flashback complete.
TEST@PROD1>desc test1;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
X1 NUMBER(38)
X2 NUMBER(38)
X3 NUMBER(38)
4.现在回收站中还有两个test1表,要求闪回包含一个字段的test1表,并且重命名为test1_old
TEST@PROD1>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1 BIN$RIeZ/j1dROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:56:03
TEST1 BIN$RIeZ/j1cROvgUwsKqMCbEA==$0 TABLE 2016-12-26:10:55:34
TEST@PROD1>
TEST@PROD1>
TEST@PROD1>desc "BIN$RIeZ/j1cROvgUwsKqMCbEA==$0";
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
X1 NUMBER(38)
进行闪回操作
TEST@PROD1>flashback table "BIN$RIeZ/j1cROvgUwsKqMCbEA==$0" to before drop rename to test1_old;
Flashback complete.
TEST@PROD1>desc test1_old;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
X1 NUMBER(38)
三.清空回收站
1.将整个表空间的回收站内容全部清空
TEST@PROD1>purge tablespace users;
Tablespace purged.
2.清空某个表空间上某个用户回收站中的对象
TEST@PROD1>purge tablespace users user test;
Tablespace purged.
3.清空当前用户下回收站
TEST@PROD1>purge recyclebin;
Recyclebin purged.
4.当以DBA身份登录时,可以清空所有表空间上回收站
SYS@PROD1>purge dba_recyclebin;
DBA Recyclebin purged.
SYS@PROD1>purge recyclebin;
Recyclebin purged.
回收站注意事项:
闪回删除不适用于:
驻留在 SYSTEM 表空间中的表
使用细粒度级审计或虚拟专用数据库的表
驻留在字典管理表空间中的表
已清除的表,无论是手动清除的,还是在空间压力下自动清除的
以下相关对象不受保护:
位图联接索引
实体化视图日志
引用完整性约束条件
在删除表前删除的索引
1.使用system表空间的表,删除不进入回收站
TEST@PROD1>create table ha tablespace system as select 1 as x from dual;
Table created.
TEST@PROD1>select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
HA SYSTEM
TEST1 USERS
TEST1_OLD USERS
T USERS
T_OLD USERS
TEST@PROD1>drop table ha;
Table dropped.
TEST@PROD1>show recyclebin;
TEST@PROD1>select original_name,object_name,type,droptime from user_recyclebin;
no rows selected
不进回收站也就意味着无法闪回删除的使用system表空间的ha表
2.使用 vpd(Virtual Private Database)的表,删除不进入回收站
TEST@PROD1>ed 001
create or replace function fun_vpd_tab_lq(p_schema in varchar2,p_object in varchar2)
return varchar2 is
begin
return 'id<100';
end;
/
TEST@PROD1>@001
Function created.
SYS@PROD1>ed 002
begin
dbms_rls.add_policy (object_schema => 'test',
object_name => 'vpd_tab',
policy_name => 'p_vpd_tab_lq',
function_schema => 'test',
policy_function => 'fun_vpd_tab_lq');
end;
/
SYS@PROD1>@002
PL/SQL procedure successfully completed.
SYS@PROD1>select * from test.vpd_tab;
ID
----------
1
100
TEST@PROD1>select * from vpd_tab;
ID
----------
1
TEST@PROD1>select table_name,tablespace_name from user_tables where table_name='VPD_TAB';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
VPD_TAB USERS
TEST@PROD1>drop table vpd_tab;
Table dropped.
查看回收站
TEST@PROD1>show recyclebin;
TEST@PROD1>select original_name,object_name,type,droptime from user_recyclebin;
no rows selected
回收站不适用vpd(Virtual Private Database)的表
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31400681/viewspace-2131372/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31400681/viewspace-2131372/