`
wsql
  • 浏览: 11793458 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

flashback六大技术之flashback drop

 
阅读更多

环境:

sys@ORCL> select * from v$version where rownum=1;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

sys@ORCL> !uname -a
Linux localhost.localdomain 2.6.18-308.el5xen #1 SMP Fri Jan 27 17:59:00 EST 2012 i686 i686 i386 GNU/Linux


1 recyclebin

在oracle 10g引入了recyclebin,对于一个对象的删除,oracle先通过修改数据字典,将其及其关联对象(索引、约束等)重命名,然后放入recyclebin。被删除的对象将占用创建时的同样的空间大小,当出现空间压力时,这个空间才会被慢慢回收。但是当对象被删除之后,这部分空间会计入free space,被看作是自由空间,可重用,在dba_free_space可查。如果能够确认删除对象,则可以使用purge命令完全删除,这样可以减少动态空间回收带来的性能代价。

每个用户都有属于自己的一个recyclebin。查看recyclebin的方法很多,最常用的是select * from recyclebin;最简单的是show recyclebin。需要注意的是show recyclebin只列出基表,被删除的表的关联对象则不显示。recyclebin里对象的名称也可以被当做普通名称一样使用,唯一区别是,无法被rename。

● 表空间无足够的空闲空间,并且没有新的空间可作扩展操作
● 该表空间又要创建新的对象,需要分配空间
在这种情形下就会造成recyclebin的空间压力,这是触发recyclebin主动删除对象的唯一原因。

清空recyclebin中对象
㈠ 修改初始化参数禁用或启用recyclebin,会话级或者实例级皆可。
缺省该参数是on

hr@ORCL> show parameter recyclebin

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on
hr@ORCL> create table tt as select * from jobs;

Table created.

hr@ORCL> show parameter recyclebin

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on
hr@ORCL> alter session set recyclebin=off;

Session altered.

hr@ORCL> drop table tt;

Table dropped.

hr@ORCL> select * from recyclebin;

no rows selected


㈡ drop ..purge;
㈢ 清空表空间现有对象
方式有三:
purge table original name或者recyclebin name
purge tablespace tbs_name
purge recylebin

2 注意事项

① flashback drop不能恢复参照完整性(即主外键关系),恢复之后,该约束为disable状态,需手动处理
② 所操作的表必须是本地表空间管理
③ 被恢复的表的关联对象(索引、约束等),其名称不会自动恢复成删除前的名称,而是系统自动生成。需DBA手动改名。另外,位图索引、物化视图不能被恢复。
④ 当空间不足时,被删除表的索引会优先被清理
⑤ flashback drop支持同时操作多个表,以逗号分隔
⑥ flashback drop只能恢复drop命令删除的表

3 实验

㈠ 最简单的删除表恢复

hr@ORCL> drop table t2;

Table dropped.

hr@ORCL> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$yUcFsAG7oGvgQAB/AQAjTg==$0 T2

hr@ORCL> flashback table t2 to before drop;

Flashback complete.

hr@ORCL> select count(*) from t2;

  COUNT(*)
----------
        19

hr@ORCL> select object_name,original_name from recyclebin;

no rows selected


㈡ 稍微复杂一点点的表恢复
如果要恢复的表在当前schema中已经存在同名的表,直接恢复会报错

hr@ORCL> drop table t2;

Table dropped.

hr@ORCL> create table t2 as select * from jobs;

Table created.

hr@ORCL> flashback table t2 to before drop;
flashback table t2 to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object


hr@ORCL> flashback table t2 to before drop rename to t2_recov;

Flashback complete.

hr@ORCL> select count(*) from t2_recov;

  COUNT(*)
----------
        19


㈢ 从多次删除中恢复
多个同名表一起进recyclebin,后进先出

hr@ORCL> drop table t2;

Table dropped.
hr@ORCL> alter table t2_recov rename to t2;

Table altered.

hr@ORCL> drop table t2;

Table dropped.

hr@ORCL> select object_name,original_name,droptime from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    DROPTIME
------------------------------ -------------------------------- -------------------
BIN$yUcFsAG/oGvgQAB/AQAjTg==$0 T2                               2012-09-09:23:47:12
BIN$yUcFsAHBoGvgQAB/AQAjTg==$0 T2                               2012-09-09:23:48:42

hr@ORCL> flashback table t2 to before drop;

Flashback complete.

hr@ORCL> select object_name,original_name,droptime from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    DROPTIME
------------------------------ -------------------------------- -------------------
BIN$yUcFsAG/oGvgQAB/AQAjTg==$0 T2                               2012-09-09:23:47:12

hr@ORCL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
REGIONS                        TABLE
COUNTRIES                      TABLE
LOCATIONS                      TABLE
DEPARTMENTS                    TABLE
JOBS                           TABLE
EMPLOYEES                      TABLE
JOB_HISTORY                    TABLE
EMP_DETAILS_VIEW               VIEW
LOGMNR_TEST                    TABLE
BIN$yUcFsAG/oGvgQAB/AQAjTg==$0 TABLE
T2                             TABLE

11 rows selected.

hr@ORCL> drop table t2;

Table dropped.

hr@ORCL> select object_name,original_name,droptime from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    DROPTIME
------------------------------ -------------------------------- -------------------
BIN$yUcFsAHDoGvgQAB/AQAjTg==$0 T2                               2012-09-09:23:52:39
BIN$yUcFsAG/oGvgQAB/AQAjTg==$0 T2                               2012-09-09:23:47:12

hr@ORCL> flashback table "BIN$yUcFsAG/oGvgQAB/AQAjTg==$0" to before drop;

Flashback complete.

hr@ORCL> select count(*) from t2;

  COUNT(*)
----------
        19

hr@ORCL> select object_name,original_name,droptime from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    DROPTIME
------------------------------ -------------------------------- -------------------
BIN$yUcFsAHDoGvgQAB/AQAjTg==$0 T2                               2012-09-09:23:52:39


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics