闪回表
SQL> conn u1/u1
已连接。
SQL> select * from tab; --现在有一张表
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
T TABLE
SQL> create index t_i on t(id); --创建一个索引
索引已创建。
SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,TABLESPACE_NAME from user_indexes; --可以看见索引的名字等相关信息
INDEX_NAME TABLE_OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
T_I U1 T TB1
SQL> select * from recyclebin; --回收站里面也没有记录
未选定行
SQL> drop table t; --删除表
表已删除。
SQL> select OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,TS_NAME from recyclebin; --回收站里面记录了表和索引
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE TS_NAME
------------------------------ -------------------------------- --------- ------------------------- ------------------------------
BIN$r4kDwrE4wLHgQAB/AQAJ0A==$0 T_I DROP INDEX TB1
BIN$r4kDwrE5wLHgQAB/AQAJ0A==$0 T DROP TABLE TB1
SQL> flashback table t to before drop; --闪回表
闪回完成。
SQL> select OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,TS_NAME from recyclebin; --回收站里面没有记录了
未选定行
SQL> select * from tab; --表的找回来了
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
T TABLE
SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,TABLESPACE_NAME from user_indexes; --索引虽然找回来了,但名字不正确
INDEX_NAME TABLE_OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
BIN$r4kDwrE4wLHgQAB/AQAJ0A==$0 U1 T TB1
SQL> alter index "BIN$r4kDwrE4wLHgQAB/AQAJ0A==$0" rename to t_i; --索引重命名
索引已更改。
SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,TABLESPACE_NAME from user_indexes; --现在名字对了
INDEX_NAME TABLE_OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
T_I U1 T TB1
重命名表名的闪回
SQL> drop table t;
表已删除。
SQL> flashback table t to before drop rename to test;
闪回完成。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TEST TABLE
SQL> select * from test;
ID VALUE
---------- ----------
1 a
2 b
3 c
SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,TABLESPACE_NAME from user_indexes;
INDEX_NAME TABLE_OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
BIN$r4kDwrE6wLHgQAB/AQAJ0A==$0 U1 TEST TB1
SQL> alter index "BIN$r4kDwrE6wLHgQAB/AQAJ0A==$0" rename to t_i;
索引已更改。
SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,TABLESPACE_NAME from user_indexes;
INDEX_NAME TABLE_OWNER TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
T_I U1 TEST TB1
注意:对于同名的删除对象,如果使用FLASHBACK TABLE TBLNAMETO BEFORE DROP,则最先被删除的表最先被恢复。如果我们只想恢复最后删除的一张表,可以直接使用回收站里面的名字闪回
FLASHBACK TABLE "BIN$uA7I/R+VQUSPEBUyQk1xXQ==$0" TO BEFORE DROP;
从UNDO表空间中恢复
SQL> select * from test;
ID VALUE
---------- ----------
1 a
2 b
3 c
SQL> conn /as sysdba
已连接。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
480981
SQL> conn u1/u1
已连接。
SQL> delete from test;
已删除3行。
SQL> select * from test;
未选定行
SQL> flashback table test to scn 480981; --没有启动行移动
flashback table test to scn 480981
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表
SQL> select row_movement from user_tables where table_name = 'TEST';
ROW_MOVE
--------
DISABLED
SQL> alter table test enable row movement; --启动行移动
表已更改。
SQL> flashback table test to scn 480981;
闪回完成。
SQL> select * from test;
ID VALUE
---------- ----------
1 a
2 b
3 c
注意:禁用表的行移动:alter table test disable row movement;
认识和管理Recycle Bin
SQL> show user
USER 为 "U1"
SQL> select * from recyclebin; --查看回收站,每个用户都有一个回收站
未选定行
SQL> conn /as sysdba
已连接。
SQL> show parameter recyclebin --是否启用回收站由这个参数决定
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
SQL> alter system set recyclebin = off; --关闭回收站
系统已更改。
SQL> alter system set recyclebin = on; --启用回收站
系统已更改。
SQL> conn u1/u1
已连接。
SQL> drop table test purge; --删除表时不放入回收站
表已删除。
SQL> purge recyclebin; --清空回收站
回收站已清空。
用purge指定表:purge table test;
用purge指定表空间:purge tablespace users;