Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1244404
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Oracle

2013-04-25 11:11:33

3、注意事项

a.基于undo的表恢复,被恢复的表必须启用row movement,不然会报ORA-08189错误,关于row movement的相关知识,三思在"全面及"一文中有过阐述,这里就不多费口舌了。

要查看某表是否启用row movement,可以到user_tables中查询(或all_tables,dba_tables),例如:

JSSWEB> select row_movement from user_tables where table_name='JSS_TB1';

ROW_MOVE

--------

ENABLED

要启用或禁止某表row movement,可以通过下列语句:

--启用

JSSWEB> ALTER TABLE JSS_TB1 ENABLE ROW MOVEMENT;

表已更改。

--禁止

JSSWEB> ALTER TABLE JSS_TB1 DISABLE ROW MOVEMENT;

表已更改。

b. 基于undo的表恢复,需要注意前文制约因素1.5.3中提到的ddl的影响。

c. 基于undo的表恢复,flashback table实际上做的也是dml操作(会在被操作的表上加dml锁),因此还需要注意triggers对其的影响,默认情况下,flashback table to scn/timestamp在执行时会自动disable掉与其操作表相差的triggers,如果你希望在此期间trigger能够继续发挥做用,可以在flashback table后附加 ENABLE TRIGGERS子句。

d. 基于undo的表恢复,索引会自动维护,但统计信息并不会恢复到指定的时间点。

e. 基于recycle bin的表恢复,flashback drop不能恢复参照完整性,这很容易理解,毕竟在该表删除之后,其被参照表是否有修改它已经无法控制了,因此如果该表有主外键约束的话,恢复之后,该约束是disable状态,需要dba手工处理。

f. 基于recycle bin的表恢复,所操作的表必须是存在于本地表空间中。Flashback drop不能恢复字典管理表空间中被删除的表,也不能恢复系统表。

g. 基于recycle bin的表恢复,被恢复的表的关联对象,比如其索引啦,约束的名称不会自动恢复成删除前的名称,而是系统自动生成的名称,如果你对表的索引约束有相关命名规范,那在恢复表之后,需要dba手工将索引约束等改名。

h. 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop时,也不能恢复依赖其的物化视图,需要dba手工介入重新创建。

i. 相对于被删除的表而言,当数据文件空间不足时,会首先清理被删除表的索引,因此假如你执行flashback table to before drop而发现缺少索引可能是正常的,说明你显然错过了最佳的恢复时机。

j. Flashback table命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。

附B:

提示:什么是Recycle Bin(回收站)

在三思之前的一些笔记中,我们曾经数次提到过这个东西,当然那些文章中介绍的都比较简单,仅仅只是一笔带过,这里呢也不准备太细致的讲解和介绍,因为这个东西确实很简单,你可以把它看成是windows中的回收站,在windows中我们删除一些文件的话,windows并非直接删除,而是直接将文件移至回收站文件夹下,Oracle中也是一样,当你删除一个表的时候,并非真正立刻执行删除的操作,而是将其重命名,连同其相关联的一些对象,如表的索引、约束等统统放入recycle bin。

每一个用户都会有一个自己的recycle bin,就像windows中每个盘符下都会有一个recycle目录(对应回收站)一样,要查看recycle bin中对象,直接:

JSSWEB> select *from recyclebin;

即可。

我们都知道在windows中删除的同时如果按着Shift则文件将会被真正删除(不钻牛角尖,我是说windows将其删除,至于你通过recovery之类工具还可再将其从磁盘恢复不再此例范围之内),那么对于oracle是否也有一种方式能够让我们执行的删除不再被放入回收站呢?答案当然是肯定,而且oracle又提供了不止一种方式(咦,为什么要说又呢)~~~~~

第一种方式:删除时指定purge参数(等同于我们在windows中按着shift删除),例如:

JSSWEB> drop table jss_tb3 purge;

表已删除。

JSSWEB> select *from recyclebin;

未选定行

第二种方式:修改初始化参数recyclebin=off,例如:

JSSWEB> create table jss_tb3 (id number);

表已创建。

JSSWEB> show parameter recyclebin

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

recyclebin                           string      on

JSSWEB> alter session set recyclebin = off;

会话已更改。

JSSWEB> show parameter recyclebin

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

recyclebin                           string      OFF

JSSWEB> drop table jss_tb3;

表已删除。

JSSWEB> select *from recyclebin;

未选定行

这里我们只针对当前session,如果希望针对整个实例,通过alter system set recyclebin=off,或者修改pfile中recyclebin参数,将其设置为off。这样所有drop table操作都会直接删表,而不再转移到recycle bin,这就相当于禁用了recycle bin功能,如果某天你又想启用该功能,只需要将该初始化参数设置为on即可。

对于已存在于recyclebin字典中的对象,如果想彻底删除该怎么办呢,Oracle再一次提供了多种方式,以及多种粒度来执行删除。

先建个测试用的环境:

JSSWEB> create table jss_tb3 (id number);

表已创建。

JSSWEB> alter session set recyclebin=on;

会话已更改。

JSSWEB> select object_name,original_name from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME

------------------------------ --------------------------------

BIN$JhA057bpRxKICIe/vNahyQ==$0 JSS_TB3

A.Purge指定表,例如:

JSSWEB> purge table jss_tb3;

JSSWEB> purge table "BIN$JhA057bpRxKICIe/vNahyQ==$0";

B.Purge指定表空间,例如:

JSSWEB> purge tablespace webtbs;

C.清空recyclebin,例如:

JSSWEB> purge recyclebin;

除上述的三种之外,还有一种方式就是删除recycle bin中对象所属用户或所在表空间,这样甭管你是否purge,recycle bin都会被清空,不过这种方式好像狠了点儿,慎用啊~~~~~

===================================

阅读(806) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~