闪回表
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;