设为首页 收藏本站
查看: 784|回复: 0

[经验分享] Oracle技术之flashback drop与索引

[复制链接]

尚未签到

发表于 2018-9-15 07:21:21 | 显示全部楼层 |阅读模式
  今天在跟朋友讨论了如下话题:
  《有一张表上建立索引,DROP该表,又闪回删除回来,请问,这张表上的索引还能用吗?如果有变化那是什么?》
  我进行了如下测试:
  sys@MAA> select * from v$version;
  BANNER
  ----------------------------------------------------------------------------------------------------

  Oracle Database 11g Enterprise Edition>
  PL/SQL>  CORE    11.2.0.3.0      Production
  TNS for Linux: Version 11.2.0.3.0 - Production
  NLSRTL Version 11.2.0.3.0 - Production
  -- 我的TEST2表上有两个索引
  luocs@MAA> select index_name, status from user_indexes where table_name='TEST2';
  INDEX_NAME                                                   STATUS
  ------------------------------------------------------------ ----------------
  INX_TEST2_ZH                                                 VALID
  INX_TEST2                                                    VALID
  luocs@MAA> set autot trace exp stat

  luocs@MAA> select count(*) from test2 where>  Execution Plan
  ----------------------------------------------------------
  Plan hash value: 3565898414
  ----------------------------------------------------------------------------------

  |>  ----------------------------------------------------------------------------------
  |   0 | SELECT STATEMENT  |              |     1 |     5 |     2   (0)| 00:00:01 |
  |   1 |  SORT AGGREGATE   |              |     1 |     5 |            |          |
  |*  2 |   INDEX RANGE SCAN| INX_TEST2_ZH |     2 |    10 |     2   (0)| 00:00:01 |
  ----------------------------------------------------------------------------------

  Predicate Information (identified by operation>  ---------------------------------------------------
  2 - access("ID"=1)
  Statistics
  ----------------------------------------------------------
  1  recursive calls
  0  db block gets
  2  consistent gets
  0  physical reads

  0  redo>  525  bytes sent via SQL*Net to client
  523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed
  -- DROP 表TEST2
  luocs@MAA> drop table test2;
  Table dropped.
  -- 索引也被删除
  luocs@MAA> select index_name, status from user_indexes where table_name='TEST2';
  no rows selected
  -- 这时候查看回收站,我们看到表的删除记录,却没有看到索引的
  luocs@MAA> show recyclebin
  ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
  ---------------- ------------------------------ ------------ -------------------
  TEST2            BIN$048hXdZTf0HgQwEAAH/4UQ==$0 TABLE        2013-01-18:19:20:06
  -- 进行闪回删除
  luocs@MAA> flashback table test2 to before drop;
  Flashback complete.
  -- 这时候又能看到索引信息,也是可用状态,却索引名称改变,依然使用回收站里的名字
  luocs@MAA> select index_name, status from user_indexes where table_name='TEST2';
  INDEX_NAME                                                   STATUS
  ------------------------------------------------------------ ----------------
  BIN$048hXdZSf0HgQwEAAH/4UQ==$0                               VALID
  BIN$048hXdZRf0HgQwEAAH/4UQ==$0                               VALID
  -- 我们也看到该索引能够正常使用
  luocs@MAA> set autot trace exp

  luocs@MAA> select count(*) from test2 where>  Execution Plan
  ----------------------------------------------------------
  Plan hash value: 3980542661
  ----------------------------------------------------------------------------------------------------

  |>  ----------------------------------------------------------------------------------------------------
  |   0 | SELECT STATEMENT  |                                |     1 |     5 |     2   (0)| 00:00:01 |
  |   1 |  SORT AGGREGATE   |                                |     1 |     5 |            |          |
  |*  2 |   INDEX RANGE SCAN| BIN$048hXdZSf0HgQwEAAH/4UQ==$0 |     2 |    10 |     2   (0)| 00:00:01 |
  ----------------------------------------------------------------------------------------------------

  Predicate Information (identified by operation>  ---------------------------------------------------
  2 - access("ID"=1)
  -- 我们可以RENAME索引名字以恢复

  luocs@MAA>>
  Index>
  luocs@MAA>>
  Index>  luocs@MAA> select index_name, status from user_indexes where table_name='TEST2';
  INDEX_NAME                                                   STATUS
  ------------------------------------------------------------ ----------------
  INX_TEST2_ZH                                                 VALID
  INX_TEST2                                                    VALID
  因此,在表被DROP掉后,索引也被放到回收站里,再我们flashback drop之后,索引也被还原,也能正常使用,但索引名却没有还原过来。
  那这里有个问题存在,既然索引页被放到回收站里,为什么执行show recyclebin的时候没有看到索引信息?
  OK,我通过如下方式解释:
  -- 通过10046事件分析下show recyclebin到底干了什么

  luocs@MAA>>
  Session>  luocs@MAA> show recyclebin

  luocs@MAA>>
  Session>  luocs@MAA> select value from v$diag_info where name = 'Default Trace File';
  VALUE
  ----------------------------------------------------------------------------------------------------
  /u01/app/oracle/diag/rdbms/maa/maa/trace/maa_ora_32580.trc
  -- 我在TRACE内容里找到如下语句,这里重点看WHERE子句CAN_UNDROP='YES'
  SELECT ORIGINAL_NAME ORIGNAME_PLUS_SHOW_RECYC,OBJECT_NAME
  OBJECTNAME_PLUS_SHOW_RECYC,TYPE OBJTYPE_PLUS_SHOW_RECYC,DROPTIME
  DROPTIME_PLUS_SHOW_RECYC
  FROM
  USER_RECYCLEBIN WHERE CAN_UNDROP='YES' ORDER BY ORIGINAL_NAME,DROPTIME DESC,
  OBJECT_NAME
  -- 这里CAN_UNDROP='YES' 起到作用了
  -- 我们看一下recyclebin$表创建语法与注释信息(Oracle 11g开始recyclebin$表创建语句在dsqlddl.bsq脚本里,位于$ORACLE_HOME/rdbms/admin)
  create table recyclebin$
  (
  obj#                  number not null,           /* original object number */
  owner#                number not null,                /* owner user number */
  original_name         varchar2(32),                /* Original Object Name */
  operation             number not null,            /* Operation carried out */
  /* 0 -> DROP */
  /* 1 -> TRUNCATE (not supported) */
  type#                 number not null,          /* object type (see KQD.H) */
  ts#                   number,                         /* tablespace number */
  file#                 number,                /* segment header file number */
  block#                number,               /* segment header block number */
  droptime              date,                /* time when object was dropped */
  dropscn               number,           /* SCN of Tx which caused the drop */
  partition_name        varchar2(32),       /* Name of the partition dropped */
  /* NULL otherwise */
  flags                 number,               /* flags for undrop processing */
  related               number not null,    /* obj one level up in heirarchy */
  bo                    number not null,                      /* base object */
  purgeobj              number not null,   /* obj to purge when purging this */
  base_ts#              number,            /* Base objects Tablespace number */
  base_owner#           number,                 /* Base objects owner number */
  space                 number,       /* number of blocks used by the object */
  con#                  number,       /* con#, if index is due to constraint */
  spare1                number,
  spare2                number,
  spare3                number
  )
  /
  -- 其中flags的注释内容是flags for undrop processing,我们可以查这张表,然后查看表和索引对应的flags分别多少
  -- 再drop 表test2,然后查看recyclebin$表
  sys@MAA> select USER_ID, USERNAME from dba_users where USERNAME='LUOCS';
  USER_ID USERNAME
  ---------- ------------------------------------------------------------
  51 LUOCS
  sys@MAA> select OBJ#, OWNER#, TYPE#, OPERATION, DROPTIME, DROPSCN, FLAGS from recyclebin$ where OWNER#=51;
  OBJ#     OWNER#      TYPE#  OPERATION DROPTIME                   DROPSCN      FLAGS
  ---------- ---------- ---------- ---------- ----------------------- ---------- ----------
  24248         51          2          0 18-JAN-2013 21:02:24       1134044         18
  24352         51          2          0 18-JAN-2013 21:02:24       1134047         18
  24247         51          1          0 18-JAN-2013 21:02:24       1134051         30
  -- 可知表对应的flags为30,索引对应的flags为18。另外,OBJ#为DROP对象前的对象编号,这个在下面闪回删除之后再证明
  OK 有点跑偏了。
  -- 我们通过10046分析出show recyclebin其实是执行下面一段SQL语句:
  SELECT ORIGINAL_NAME ORIGNAME_PLUS_SHOW_RECYC,OBJECT_NAME
  OBJECTNAME_PLUS_SHOW_RECYC,TYPE OBJTYPE_PLUS_SHOW_RECYC,DROPTIME
  DROPTIME_PLUS_SHOW_RECYC
  FROM
  USER_RECYCLEBIN WHERE CAN_UNDROP='YES' ORDER BY ORIGINAL_NAME,DROPTIME DESC,
  OBJECT_NAME
  -- 我们将CAN_UNDROP='YES'去掉,然后执行:
  luocs@MAA> SELECT ORIGINAL_NAME ORIGNAME_PLUS_SHOW_RECYC,OBJECT_NAME
  2    OBJECTNAME_PLUS_SHOW_RECYC,TYPE OBJTYPE_PLUS_SHOW_RECYC,DROPTIME
  3    DROPTIME_PLUS_SHOW_RECYC
  4  FROM
  5   USER_RECYCLEBIN ORDER BY ORIGINAL_NAME,DROPTIME DESC,
  6    OBJECT_NAME
  7  /
  ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
  ---------------- ------------------------------ ------------ -------------------
  INX_TEST2        BIN$05C5BoYUf0TgQwEAAH+5aw==$0 INDEX        2013-01-18:21:02:24
  INX_TEST2_ZH     BIN$05C5BoYVf0TgQwEAAH+5aw==$0 INDEX        2013-01-18:21:02:24
  TEST2            BIN$05C5BoYWf0TgQwEAAH+5aw==$0 TABLE        2013-01-18:21:02:24
  -- 从这里我们也获得了原对象名以及回收站里的对象名,因此RENAME的时候可以找对对象。
  -- 将CAN_UNDROP 设置为 'NO'再执行:
  luocs@MAA> SELECT ORIGINAL_NAME ORIGNAME_PLUS_SHOW_RECYC,OBJECT_NAME
  2    OBJECTNAME_PLUS_SHOW_RECYC,TYPE OBJTYPE_PLUS_SHOW_RECYC,DROPTIME
  3    DROPTIME_PLUS_SHOW_RECYC
  4  FROM
  5   USER_RECYCLEBIN WHERE CAN_UNDROP='NO' ORDER BY ORIGINAL_NAME,DROPTIME DESC,
  6    OBJECT_NAME
  7  /
  ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
  ---------------- ------------------------------ ------------ -------------------
  INX_TEST2        BIN$05C5BoYUf0TgQwEAAH+5aw==$0 INDEX        2013-01-18:21:02:24
  INX_TEST2_ZH     BIN$05C5BoYVf0TgQwEAAH+5aw==$0 INDEX        2013-01-18:21:02:24
  -- 进行flashback drop
  luocs@MAA> flashback table test2 to before drop;
  Flashback complete.
  -- 再查询已经看不到内容了
  luocs@MAA> SELECT ORIGINAL_NAME ORIGNAME_PLUS_SHOW_RECYC,OBJECT_NAME
  2    OBJECTNAME_PLUS_SHOW_RECYC,TYPE OBJTYPE_PLUS_SHOW_RECYC,DROPTIME
  3    DROPTIME_PLUS_SHOW_RECYC
  4  FROM
  5   USER_RECYCLEBIN ORDER BY ORIGINAL_NAME,DROPTIME DESC,
  6    OBJECT_NAME
  7  /
  no rows selected
  -- 根据上面获得的对象编号来查看对象名字
  sys@MAA> col OBJECT_NAME for a30
  sys@MAA> col OWNER for a30
  sys@MAA> select OBJECT_NAME, OWNER from dba_objects where OBJECT_ID IN ('24248','24352','24247');
  OBJECT_NAME                    OWNER
  ------------------------------ ------------------------------
  BIN$048hXdZVf0HgQwEAAH/4UQ==$1 LUOCS
  BIN$048hXdZUf0HgQwEAAH/4UQ==$1 LUOCS
  TEST2                          LUOCS
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-583075-1-1.html 上篇帖子: Oracle技术之查看并行相关信息 下篇帖子: Oracle技术之flashback drop与索引
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表