RecycleBin
出自家园之一亩三分地儿
跳转到: 导航, 搜索
1. 启用/禁用RecycleBin:
通过设置初始化参数recyclebin,可以控制是否启用回收站功能,默认是开启的。
�]2q�Y�E/_*o9V�|/t�\0SQL> alter system set recyclebin=off;
系统已更改。
SQL> alter system set recyclebin=on;
系统已更改。
SQL> alter session set recyclebin=off;
会话已更改。
SQL> alter session set recyclebin=on;
会话已更改。
2. 查看回收站:
SQL> SHOW recyclebin;
或者
SQL>select * from recyclebin;
除非拥有sysdba权限,否则每个用户只能看到属于自己的对象。所以,对于用户来说,好像每个人都拥有自己的回收站。即使用户有删除其他schema对象的权限,也只能在recyclebin中看到属于自己的对象。
3. 回收站对象的操作:
当一个表被删除并移动到"回收站"中,它的名字要进行一些转换。这样的目的是为了避免同类对象名称的重复。(这一点和Windows操作系统的回收站不同,Windows中的回收站经过了特殊的处理,操作系统文件可以重名。)转换后的名字格式如下:
BIN$unique_id$version其中BIN代表RecycleBin,unique_id是数据库中该对象的唯一标志,26个字符长度version表示该对象的版本号。
注意,以下几种drop不会将相关对象放进RecycleBin:
drop tablespace:会将RecycleBin中所有属于该tablespace的对象清除
drop user:会将RecycleBin中所有属于该用户的对象清除
drop cluster:会将RecycleBin中所有属于该cluster的成员对象清除
drop type:会将RecycleBin中所有依赖该type的对象清除
l 已经放到回收站里的表是不能用drop命令删除的(注意对象名字上的双引号):
SQL> DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0" ;
DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
ERROR at line 1:
ORA-38301: can not perform. DDL/DML over objects in Recycle Bin
如果要清掉该对象,使用purge命令:
SQL> PURGE table "BIN$V3f/oYUITrCEF2cotS5JaA==$0" ;
Table purged.
l 如果直接清空所有的Recycle Bin中的对象:
SQL> PURGE RECYCLEBIN;
Recyclebin purged.
Purge recyclebin可以清除执行该命令的用户所能看到的所有recyclebin对象。也就是普通用户能清除属于自己的对象,而sysdba用户则能清除所有recyclebin中的对象。
l 恢复表,用回闪表的功能:
SQL> FLASHBACK TABLE table_name TO BEFORE DROP;
Flashback complete.
默认的恢复是第一个被删除的表。如果要恢复指定的表,可以在FLASHBACK TABLE后面加上指定的RECYCLEBIN参数指定其他的名字:
语句FLASHBACK TABLE [已删除TABLE名|"RECYCLEBIN中的名字"] TO BEFORE DROP;
但当你在RECYCLEBIN内有2张相同名字的表时候,只有通过"RECYCLEBIN中的名字"来闪回指定的表,用上面方法只闪回第一个被删除的同名表。
l Purge tablespace tablespace_name可以清除RecycleBin属于指定tablespace的所有对象。ITPUB个人空间:Z�q�S�N!m*[
SQL> purge tablespace users;
表空间已清除。
Purge tablespace tablespace_name user user_name则可以清除Recycle中属于指定tablespace和指定user的所有对象。
/I7|%a,m�U�r�e6I�B0SQL> purge tablespace users user ning;
表空间已清除。
l 清除表时,同时也会清除依赖这张表的约束,如索引。可以指定只清除表相应的约束,如:PURGE INDEX IDX_TEST。
表上的对象如索引、触发器在表被闪回后是不会被同时闪回的,而是保持了在回收站中名字。一些依赖这张表的代码对象如视图、存储过程在表被删除后会失效,在表被闪回后不会被自动重新编译,而要手工重新编译他们。相关的信息被保存在视图USER_RECYCLE中。可以用以下语句来获得这些索引、触发器对象的原有名称:
1 SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE
2 FROM USER_RECYCLEBINITPUB个人空间7p(d$G�[�l;`�u
3 WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBIN
�F�?2e j�v }�j0 4 WHERE ORIGINAL_NAME = 'ABC')ITPUB个人空间�R b E�U0h�I
5 AND ORIGINAL_NAME != 'ABC';ITPUB个人空间 t:l�c�B#G G8L�E�L
OBJECT_NAME ORIGINAL_N TYPE
�Z�q1x r�~0 ------------------------------ ---------- --------
�g6A3N�a'V)R�e/L0 BIN$1++ilvsQQ7mfPh2pvont5A==$0 IDX_TEST INDEX
可以用以下方式来恢复索引:
SQL> ALTER INDEX " BIN$1++ilvsQQ7mfPh2pvont5A==$0" RENAME TO IDX_TEST;
一个例外就是位图索引被删除后是不会被保存在回收站中的,也无法从上述视图中查到,需要用其他方式来恢复。
出自家园之一亩三分地儿
跳转到: 导航, 搜索
1. 启用/禁用RecycleBin:
通过设置初始化参数recyclebin,可以控制是否启用回收站功能,默认是开启的。
�]2q�Y�E/_*o9V�|/t�\0SQL> alter system set recyclebin=off;
系统已更改。
SQL> alter system set recyclebin=on;
系统已更改。
SQL> alter session set recyclebin=off;
会话已更改。
SQL> alter session set recyclebin=on;
会话已更改。
2. 查看回收站:
SQL> SHOW recyclebin;
或者
SQL>select * from recyclebin;
除非拥有sysdba权限,否则每个用户只能看到属于自己的对象。所以,对于用户来说,好像每个人都拥有自己的回收站。即使用户有删除其他schema对象的权限,也只能在recyclebin中看到属于自己的对象。
3. 回收站对象的操作:
当一个表被删除并移动到"回收站"中,它的名字要进行一些转换。这样的目的是为了避免同类对象名称的重复。(这一点和Windows操作系统的回收站不同,Windows中的回收站经过了特殊的处理,操作系统文件可以重名。)转换后的名字格式如下:
BIN$unique_id$version其中BIN代表RecycleBin,unique_id是数据库中该对象的唯一标志,26个字符长度version表示该对象的版本号。
注意,以下几种drop不会将相关对象放进RecycleBin:
drop tablespace:会将RecycleBin中所有属于该tablespace的对象清除
drop user:会将RecycleBin中所有属于该用户的对象清除
drop cluster:会将RecycleBin中所有属于该cluster的成员对象清除
drop type:会将RecycleBin中所有依赖该type的对象清除
l 已经放到回收站里的表是不能用drop命令删除的(注意对象名字上的双引号):
SQL> DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0" ;
DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
ERROR at line 1:
ORA-38301: can not perform. DDL/DML over objects in Recycle Bin
如果要清掉该对象,使用purge命令:
SQL> PURGE table "BIN$V3f/oYUITrCEF2cotS5JaA==$0" ;
Table purged.
l 如果直接清空所有的Recycle Bin中的对象:
SQL> PURGE RECYCLEBIN;
Recyclebin purged.
Purge recyclebin可以清除执行该命令的用户所能看到的所有recyclebin对象。也就是普通用户能清除属于自己的对象,而sysdba用户则能清除所有recyclebin中的对象。
l 恢复表,用回闪表的功能:
SQL> FLASHBACK TABLE table_name TO BEFORE DROP;
Flashback complete.
默认的恢复是第一个被删除的表。如果要恢复指定的表,可以在FLASHBACK TABLE后面加上指定的RECYCLEBIN参数指定其他的名字:
语句FLASHBACK TABLE [已删除TABLE名|"RECYCLEBIN中的名字"] TO BEFORE DROP;
但当你在RECYCLEBIN内有2张相同名字的表时候,只有通过"RECYCLEBIN中的名字"来闪回指定的表,用上面方法只闪回第一个被删除的同名表。
l Purge tablespace tablespace_name可以清除RecycleBin属于指定tablespace的所有对象。ITPUB个人空间:Z�q�S�N!m*[
SQL> purge tablespace users;
表空间已清除。
Purge tablespace tablespace_name user user_name则可以清除Recycle中属于指定tablespace和指定user的所有对象。
/I7|%a,m�U�r�e6I�B0SQL> purge tablespace users user ning;
表空间已清除。
l 清除表时,同时也会清除依赖这张表的约束,如索引。可以指定只清除表相应的约束,如:PURGE INDEX IDX_TEST。
表上的对象如索引、触发器在表被闪回后是不会被同时闪回的,而是保持了在回收站中名字。一些依赖这张表的代码对象如视图、存储过程在表被删除后会失效,在表被闪回后不会被自动重新编译,而要手工重新编译他们。相关的信息被保存在视图USER_RECYCLE中。可以用以下语句来获得这些索引、触发器对象的原有名称:
1 SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE
2 FROM USER_RECYCLEBINITPUB个人空间7p(d$G�[�l;`�u
3 WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBIN
�F�?2e j�v }�j0 4 WHERE ORIGINAL_NAME = 'ABC')ITPUB个人空间�R b E�U0h�I
5 AND ORIGINAL_NAME != 'ABC';ITPUB个人空间 t:l�c�B#G G8L�E�L
OBJECT_NAME ORIGINAL_N TYPE
�Z�q1x r�~0 ------------------------------ ---------- --------
�g6A3N�a'V)R�e/L0 BIN$1++ilvsQQ7mfPh2pvont5A==$0 IDX_TEST INDEX
可以用以下方式来恢复索引:
SQL> ALTER INDEX " BIN$1++ilvsQQ7mfPh2pvont5A==$0" RENAME TO IDX_TEST;
一个例外就是位图索引被删除后是不会被保存在回收站中的,也无法从上述视图中查到,需要用其他方式来恢复。