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

[经验分享] Oracle 10g flashback table 索引名带来的变化

[复制链接]
YunVN网友  发表于 2016-8-15 06:44:58 |阅读模式
今天在做测试时,无意中发现索引名出现异常:
引用
SQL> set autot traceonly exp stat
SQL> select * from zhoultest where obj#=1023;

56 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2999462806

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

| Id  | Operation                   | Name                           | Rows  | B
ytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT            |                                |    54 |
4266 |    55   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| ZHOULTEST                      |    54 |
4266 |    55   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | BIN$oeMDlvXEdhjgQBCsowQz5w==$0 |    54 |
     |     3   (0)| 00:00:01 |


该索引名类似于表格被删除之后,在回收站中的名字,但是在回收站并没有该索引对象:
引用
SQL> show recyclebin

情况回收站,也不影响该索引
引用
SQL> purge recyclebin;

Recyclebin purged.

SQL> select INDEX_NAME,INDEX_TYPE from user_indexes where table_name='ZHOULTEST';

INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
BIN$oeMDlvXDdhjgQBCsowQz5w==$0 NORMAL
BIN$oeMDlvXEdhjgQBCsowQz5w==$0 NORMAL
BIN$oeMDlvXFdhjgQBCsowQz5w==$0 NORMAL

后来仔细回忆原来是zhoultest这张表格前几天在做测试时,曾经删除过,后来又将其闪回了。原来Oracle在做表格闪回时,默认将其索引也闪回,但是名字还保留回收站里的名字。
于是可以用以下语法将索引名改名:
引用
SQL> alter index "BIN$oeMDlvXDdhjgQBCsowQz5w==$0" rename to indx1;

Index altered.

在很多系统中,索引名字的命名都有其一套规则,闪回表格之后Oracle为什么不顺便把索引名也附带闪回呢?如果采用系统命名,在以后的管理上会带来诸多的不便。
继续研究:
首先将其余索引重命名
引用
SQL> alter index "BIN$oeMDlvXEdhjgQBCsowQz5w==$0" rename to indx2;

Index altered.

SQL> alter index "BIN$oeMDlvXFdhjgQBCsowQz5w==$0" rename to indx3;

Index altered.

再次将表格删除
引用
SQL> drop table zhoultest;

Table dropped.

观察recyclebin$,我们可以得到很多信息:
引用
SQL> col ORIGINAL_NAME for a30
SQL> col dropscn for 999999999999999
SQL> select OBJ#,OWNER#,ORIGINAL_NAME,DROPSCN,FLAGS from recyclebin$;

      OBJ#     OWNER# ORIGINAL_NAME                           DROPSCN      FLAGS
---------- ---------- ------------------------------ ---------------- ----------
     72817         60 INDX1                            10995361920804         18
     73071         60 INDX2                            10995361920806         18
    246364         60 INDX3                            10995361920808         18
     72659         60 ZHOULTEST                        10995361920813         30

1、从DROPSCN可以看出,Oracle删除表格时先进行索引删除操作。
2、索引在recyclebin$表格中的flag标记是18,table的flag标记是30。
通过查看sql.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
)

可以看到recyclebin$有4条记录,但show recyclebin只有1条表格记录,可见show recyclebin进行了过滤。用10046跟踪show recyclebin过程
引用
SQL> conn zhoul/zhoul
Connected.
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';

Session altered.

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
ZHOULTEST        BIN$ogYyR9j5/3/gQBCsowRnLQ==$0 TABLE        2011-04-29:10:11:48
SQL>  ALTER SESSION SET EVENTS '10046 trace name context off';

Session altered.

打开跟踪文件,可以看到在选择数据时对USER_RECYCLEBIN进行了CAN_UNDROP='YES'过滤。
引用
PARSING IN CURSOR #2 len=240 dep=0 uid=60 oct=3 lid=60 tim=1273480412774274 hv=2786599706 ad='25dfe610'
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
END OF STMT


引用
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;

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
ZHOULTEST        BIN$ogYyR9j5/3/gQBCsowRnLQ==$0 TABLE        2011-04-29:10:11:48

如果不加过滤条件,默认的话,会将索引和表格全部展示:
引用
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 ;

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
INDX1            BIN$ogYyR9j2/3/gQBCsowRnLQ==$0 INDEX        2011-04-29:10:11:48
INDX2            BIN$ogYyR9j3/3/gQBCsowRnLQ==$0 INDEX        2011-04-29:10:11:48
INDX3            BIN$ogYyR9j4/3/gQBCsowRnLQ==$0 INDEX        2011-04-29:10:11:48
ZHOULTEST        BIN$ogYyR9j5/3/gQBCsowRnLQ==$0 TABLE        2011-04-29:10:11:48

再次将表格闪回,可以看到索引名是系统命名的,忍不住想问Oracle,既然都将索引闪回了,闪回时为什么不把索引名也重名命一下?

引用
SQL> flashback table zhoultest to before drop;

Flashback complete.

SQL> select INDEX_NAME,INDEX_TYPE from user_indexes where table_name='ZHOULTEST';

INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
BIN$ogYyR9j2/3/gQBCsowRnLQ==$0 NORMAL
BIN$ogYyR9j3/3/gQBCsowRnLQ==$0 NORMAL
BIN$ogYyR9j4/3/gQBCsowRnLQ==$0 NORMAL

运维网声明 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.yunweiku.com/thread-257779-1-1.html 上篇帖子: Oracle任务调度之基于事件的任务调度(原创 ) 下篇帖子: 实例对比Oracle中truncate和delete的区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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