查看: 17170|回复: 26

[精华] FlashBack表后, 如何处理有依赖关系的对象

[复制链接]
认证徽章
论坛徽章:
106
2008新春纪念徽章
日期:2008-02-13 12:43:03ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主4段
日期:2012-05-15 15:24:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
发表于 2008-8-21 17:19 | 显示全部楼层 |阅读模式
一.当我们意外的drop掉一张表时,在Oracle 10g中可以很轻松的flashback回来,只要在开启recyclebin功能的情况下.
那么如果被drop的表上有其他依赖关系的对象(比如存储过程,触发器,索引等),这些对象会出现怎样的情况,同时我们flashback表后,这些对象又当如何处理?
针对这种情况做了以下测试及小结

[php]

1.创建模拟环境

YXYUP@dbatest>alter database datafile '/u01/oracle/oradata/dbatest/tbs01.dbf' resize 17m;

Database altered.

Elapsed: 00:00:00.18

YXYUP@dbatest>create table test tablespace tbs as select * from dba_objects;

Table created.

Elapsed: 00:00:00.69

YXYUP@dbatest>create table test_bak tablespace tbs as select * from test;

Table created.

Elapsed: 00:00:00.54

YXYUP@dbatest>create index idx_test_object_id on test(object_id) tablespace tbs;

Index created.

Elapsed: 00:00:00.33
YXYUP@dbatest>select segment_name,bytes/1024/1024 from user_segments;

SEGMENT_NAME                   BYTES/1024/1024
------------------------------ ---------------
TEST_BAK                                     6
TEST                                         6
IDX_TEST_OBJECT_ID                           1

YXYUP@dbatest>create or replace procedure sp_test
  2  is
  3  id_cnt number;
  4  begin
  5  select count(object_id) into id_cnt from test;
  6  dbms_output.put_line('Object_id : '||id_cnt);
  7  end;
  8  /

Procedure created.

Elapsed: 00:00:00.04
YXYUP@dbatest>exec sp_test;
Object_id : 50397

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01


YXYUP@dbatest>create or replace trigger trg_test
  2  after insert or delete on test
  3  for each row
  4  begin
  5   if inserting then
  6   insert into test_bak(owner,object_name,subobject_name,object_id,data_object_id,object_type,created,last_ddl_time,timestamp,status,temporary,generated,secondary)
  7   values(:new.owner,:new.object_name,:new.subobject_name,:new.object_id,:new.data_object_id,:new.object_type,:new.created,:new.last_ddl_time,:new.timestamp,:new.status,:new.temporary,:new.generated,:new.secondary);
  8   end if;
  9   if deleting then
10   delete from test_bak where object_id=ld.object_id;
11   end if;
12  exception
13  when others then
14   dbms_output.put_line(sqlerrm);   
15  end;
16  /

Trigger created.

YXYUP@dbatest>select object_name,status from user_objects ;   

OBJECT_NAME                      STATUS
-------------------------------- -------
TEST                             VALID
TEST_BAK                         VALID
IDX_TEST_OBJECT_ID               VALID
SP_TEST                          VALID
TRG_TEST                         VALID

2.删除表

YXYUP@dbatest>drop table test;

Table dropped.

Elapsed: 00:00:00.17

3.发现在该表上定义了索引或触发器也被重命名,但存储过程并没有,存储过程只是状态变成了invalid了.

YXYUP@dbatest>show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$VPH4ibnGVd/gQAB/AQA0Nw==$0 TABLE        2008-08-21:13:55:40

YXYUP@dbatest>select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST_BAK                       TABLE
BIN$VPH4ibnGVd/gQAB/AQA0Nw==$0 TABLE

Elapsed: 00:00:00.01

YXYUP@dbatest>select object_name,object_type,status from user_objects;

OBJECT_NAME                      OBJECT_TYPE         STATUS
-------------------------------- ------------------- -------
TEST_BAK                         TABLE               VALID
BIN$VPH4ibnFVd/gQAB/AQA0Nw==$0   TRIGGER             INVALID
SP_TEST                          PROCEDURE           INVALID
BIN$VPH4ibnGVd/gQAB/AQA0Nw==$0   TABLE               VALID
BIN$VPH4ibnEVd/gQAB/AQA0Nw==$0   INDEX               VALID

Elapsed: 00:00:00.02

4.闪回被删除的表

YXYUP@dbatest>flashback table test to before drop;

Flashback complete.

Elapsed: 00:00:00.06

YXYUP@dbatest>select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST                           TABLE
TEST_BAK                       TABLE

Elapsed: 00:00:00.01

5.表被闪回后,索引和触发器的名字和状态并没有改变回来.

YXYUP@dbatest>select object_name,object_type,status from user_objects;

OBJECT_NAME                      OBJECT_TYPE         STATUS
-------------------------------- ------------------- -------
TEST                             TABLE               VALID
TEST_BAK                         TABLE               VALID
BIN$VPH4ibnFVd/gQAB/AQA0Nw==$0   TRIGGER             INVALID
SP_TEST                          PROCEDURE           INVALID
BIN$VPH4ibnEVd/gQAB/AQA0Nw==$0   INDEX               VALID

Elapsed: 00:00:00.01

6.手工处理被闪回的表有依赖关系的对象

YXYUP@dbatest>alter index "BIN$VPH4ibnEVd/gQAB/AQA0Nw==$0" rename to IDX_TEST_OBJECT_ID ;

Index altered.

Elapsed: 00:00:00.03
YXYUP@dbatest>alter trigger "BIN$VPH4ibnFVd/gQAB/AQA0Nw==$0" rename to TRG_TEST ;

Trigger altered.

Elapsed: 00:00:00.01
YXYUP@dbatest>select object_name,object_type,status from user_objects;

OBJECT_NAME                      OBJECT_TYPE         STATUS
-------------------------------- ------------------- -------
TEST                             TABLE               VALID
TEST_BAK                         TABLE               VALID
SP_TEST                          PROCEDURE           INVALID
IDX_TEST_OBJECT_ID               INDEX               VALID
TRG_TEST                         TRIGGER             INVALID

Elapsed: 00:00:00.01

YXYUP@dbatest>alter trigger TRG_TEST compile;

Trigger altered.

Elapsed: 00:00:00.04
YXYUP@dbatest>alter procedure SP_TEST compile;

Procedure altered.

Elapsed: 00:00:00.03
YXYUP@dbatest>select object_name,object_type,status from user_objects;

OBJECT_NAME                      OBJECT_TYPE         STATUS
-------------------------------- ------------------- -------
TEST                             TABLE               VALID
TEST_BAK                         TABLE               VALID
SP_TEST                          PROCEDURE           VALID
IDX_TEST_OBJECT_ID               INDEX               VALID
TRG_TEST                         TRIGGER             VALID

Elapsed: 00:00:00.02




7.小结
从上面整个测试过程,我们可以看出.
表在删除后,如果在该表上定义了索引或触发器也被重命名,使用与表相同的命名规则。任何有依赖关系的对象(如存储过程)都失效.
表在闪回后,索引或触发器名字并不会改变回来,其他对象的状态也不会变成valid.这些都要手工处理.切记.


________________________________
[/php]

[ 本帖最后由 yxyup 于 2008-8-22 13:21 编辑 ]
认证徽章
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
发表于 2008-8-21 19:16 | 显示全部楼层

使用道具 举报

回复
论坛徽章:
62
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01
发表于 2008-8-22 23:07 | 显示全部楼层
确实是这样的,上次帮客户做一次恢复,忘记编译procedure, 结果引起严重的library cache lock/pin 。是要注意啊。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
奥运会纪念徽章:赛艇
日期:2008-07-05 23:31:28数据库板块每日发贴之星
日期:2009-01-07 01:01:02数据库板块每日发贴之星
日期:2009-02-03 01:01:02ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:45生肖徽章2007版:狗
日期:2009-03-10 21:36:37生肖徽章2007版:鼠
日期:2009-03-14 08:57:17CTO参与奖
日期:2009-03-23 11:00:182010广州亚运会纪念徽章:空手道
日期:2011-02-18 16:02:23迷宫蛋
日期:2011-07-31 01:30:132009新春纪念徽章
日期:2009-01-04 14:52:28
发表于 2008-8-25 16:57 | 显示全部楼层
不错,我也做过测试

使用道具 举报

回复
论坛徽章:
21
红旗
日期:2013-09-30 15:26:01凯迪拉克
日期:2013-10-23 12:48:26比亚迪
日期:2013-11-01 09:19:01奔驰
日期:2013-12-13 09:27:30马上有对象
日期:2014-11-18 10:46:242015年新春福章
日期:2015-04-28 15:24:55慢羊羊
日期:2015-05-28 09:49:31
发表于 2008-8-27 16:39 | 显示全部楼层
还有外键约束 需要考虑 ,先收藏,有时间测试一下

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2008-09-24 15:23:21奥运会纪念徽章:摔跤
日期:2008-10-24 13:21:29
发表于 2008-8-28 16:32 | 显示全部楼层
请问下:Elapsed: 00:00:00.02这种统计信息是如何让它出现的?
set elapsed on 不行,谁告诉我下,谢谢。

使用道具 举报

回复
认证徽章
论坛徽章:
106
2008新春纪念徽章
日期:2008-02-13 12:43:03ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主4段
日期:2012-05-15 15:24:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
发表于 2008-8-28 16:47 | 显示全部楼层
原帖由 liubo_20080808 于 2008-8-28 16:32 发表
请问下:Elapsed: 00:00:00.02这种统计信息是如何让它出现的?
set elapsed on 不行,谁告诉我下,谢谢。


set timing on

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-03-01 11:19:502011新春纪念徽章
日期:2011-02-18 11:43:362012新春纪念徽章
日期:2012-01-04 11:53:29
发表于 2008-9-22 17:33 | 显示全部楼层
看贴中进步。。。牛啊

使用道具 举报

回复
论坛徽章:
66
皇马
日期:2009-02-13 09:38:532011新春纪念徽章
日期:2011-02-18 11:43:342010广州亚运会纪念徽章:柔道
日期:2011-04-08 23:11:212010广州亚运会纪念徽章:排球
日期:2011-04-18 22:00:58鲜花蛋
日期:2011-05-30 21:23:49ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15迷宫蛋
日期:2012-12-18 23:39:42问答徽章
日期:2013-09-25 16:14:23优秀写手
日期:2015-02-12 06:00:13
发表于 2008-9-22 21:54 | 显示全部楼层
表在删除后,如果在该表上定义了索引或触发器也被重命名,使用与表相同的命名规则。任何有依赖关系的对象(如存储过程)都失效.


总结的很好  这个以后一定要注意

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2008-9-23 14:13 | 显示全部楼层
学习了~

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表