现在的位置: 首页 > 综合 > 正文

Flashback Table!

2013年02月18日 ⁄ 综合 ⁄ 共 3771字 ⁄ 字号 评论关闭

闪回表

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;

抱歉!评论已关闭.