Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

31

积分

0

好友

0

主题
1#
发表于 2012-2-28 22:53:04 | 查看: 6493| 回复: 2
db version : 10.0. 2. 1

表结构的ddl为 :
  1. create table tb_partiexchange(
  2.                 x int,
  3.                 y date,
  4.                 z varchar2(20),
  5.                 constraint pk_partiex_x primary key(x) using index local
  6. )partition by range(x)(
  7.                 partition pt_1 values less than(5) tablespace test1,
  8.                 partition pt_2 values less than(10) tablespace test2
  9. );

  10. create index indx_partiexchange_y on tb_partiexchange(y);

  11. insert into tb_partiexchange values(1, sysdate, 'pt1');
  12. insert into tb_partiexchange values(7, sysdate, 'pt2');

  13. commit;

  14. create table dummy_partiexchange(
  15.                 x int,
  16.                 y date,
  17.                 z varchar2(20)
  18. )tablespace test1;

  19. --结构要一样
  20. alter table dummy_partiexchange add constraint pk_dummypartiexchange primary key(x);
  21. create index indx_partiy_y on dummy_partiexchange(y);
复制代码
执行分区交换操作:
SQL> alter table tb_partiexchange exchange partition pt_1 with table dummy_partiexchange including indexes;

alter table tb_partiexchange exchange partition pt_1 with table dummy_partiexchange including indexes

ORA-14098: index mismatch for tables in ALTER TABLE EXCHANGE PARTITION


参考文章:http://www.oracledatabase12g.com ... 94%99%E8%AF%AF.html

给出执行部分sql得到的结果:
  1. SQL> Select TABLE_NAME,INDEX_NAME, COLUMN_NAME,COLUMN_POSITION, COLUMN_LENGTH, CHAR_LENGTH, DESCEND
  2.   2  FROM SYS.DBA_IND_COLUMNS DICN
  3.   3  WHERE INDEX_OWNER = '&own'
  4.   4   and DICN.TABLE_NAME in ('&TABNAME1','&TABNAME2')
  5.   5  ORDER BY  INDEX_NAME, COLUMN_POSITION
  6.   6  /

  7. TABLE_NAME                     INDEX_NAME                     COLUMN_NAME        COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
  8. ------------------------------ ------------------------------ ------------------ --------------- ------------- ----------- -------
  9. TB_PARTIEXCHANGE               INDX_PARTIEXCHANGE_Y           Y                                1             7           0 ASC
  10. DUMMY_PARTIEXCHANGE            INDX_PARTIY                    Y                                1             7           0 ASC
  11. DUMMY_PARTIEXCHANGE            PK_DUMMYPARTIEXCHANGE          X                                1            22           0 ASC
  12. TB_PARTIEXCHANGE               PK_PARTIEX_X                   X                                1            22           0 ASC

  13. SQL>
  14. SQL> select TABLE_NAME, INDEX_NAME, INDEX_TYPE, UNIQUENESS, PARTITIONED
  15.   2    from dba_indexes
  16.   3   where owner='&OWNER'
  17.   4     and TABLE_NAME in ('&TABNAME1', '&TABNAME2')
  18.   5   order by index_name
  19.   6  /

  20. TABLE_NAME                     INDEX_NAME                     INDEX_TYPE      UNIQUENESS PARTITIONED
  21. ------------------------------ ------------------------------ --------------- ---------- -----------
  22. TB_PARTIEXCHANGE               INDX_PARTIEXCHANGE_Y           NORMAL          NONUNIQUE  NO
  23. DUMMY_PARTIEXCHANGE            INDX_PARTIY                    NORMAL          NONUNIQUE  NO
  24. DUMMY_PARTIEXCHANGE            PK_DUMMYPARTIEXCHANGE          NORMAL          UNIQUE     NO
  25. TB_PARTIEXCHANGE               PK_PARTIEX_X                   NORMAL          UNIQUE     YES

  26. SQL>
复制代码
比对发现分区表tb_partiexchange和交换表dummy_partiexchange的索引基本是一致的。

根据文章的提示,附件是10046的trace文件

ora10gr2_ora_6473.zip

346.05 KB, 下载次数: 1124

2#
发表于 2012-2-28 23:04:20
ODM Test:
  1. SQL> create table tb_partiexchange(
  2.   2                  x int,
  3.   3                  y date,
  4.   4                  z varchar2(20),
  5.   5                  constraint pk_partiex_x primary key(x) using index local
  6.   6  )partition by range(x)(
  7.   7                  partition pt_1 values less than(5) tablespace users,
  8.   8                  partition pt_2 values less than(10) tablespace users
  9.   9  );

  10. 表已创建。

  11. SQL>
  12. SQL> create index indx_partiexchange_y on tb_partiexchange(y);

  13. 索引已创建。

  14. SQL>
  15. SQL> insert into tb_partiexchange values(1, sysdate, 'pt1');

  16. 已创建 1 行。

  17. SQL> insert into tb_partiexchange values(7, sysdate, 'pt2');

  18. 已创建 1 行。

  19. SQL>
  20. SQL> commit;

  21. 提交完成。

  22. SQL>
  23. SQL>
  24. SQL> create table dummy_partiexchange(
  25.   2                  x int,
  26.   3                  y date,
  27.   4                  z varchar2(20)
  28.   5  )tablespace users;

  29. 表已创建。

  30. SQL>
  31. SQL> alter table dummy_partiexchange add constraint pk_dummypartiexchange primary key(x);

  32. 表已更改。

  33. SQL> create index indx_partiy_y on dummy_partiexchange(y);

  34. 索引已创建。






  35. SQL> alter table tb_partiexchange exchange partition pt_1 with table dummy_partiexchange including indexes;
  36. alter table tb_partiexchange exchange partition pt_1 with table dummy_partiexchange including indexes
  37.                                                                 *
  38. 第 1 行出现错误:
  39. ORA-14098: ALTER TABLE EXCHANGE PARTITION 中的表索引不匹配



  40. SQL> drop index indx_partiexchange_y;

  41. 索引已删除。

  42. SQL> create index indx_partiexchange_y on tb_partiexchange(y) local;

  43. 索引已创建。

  44. SQL> alter table tb_partiexchange exchange partition pt_1 with table dummy_partiexchange including indexes;

  45. 表已更改。
复制代码

回复 只看该作者 道具 举报

3#
发表于 2012-2-28 23:11:04
解决ORA-14098错误的要点是要找出引发错误的原因。当我们交换分区的时候,我们要确保所有交换表上的索引和分区表上的本地索引匹配。这意味着如果在分区表上有N个LOCAL INDEXES,那么在交换表上就应当有N个等价的索引。这里的等价要求存在映射关系的2个索引,在列的位置、类型、大小及UNIQUE/NON-UNIQUE都要一致。

Local Index 才能实现exchange partition including indexes

When you use the INCLUDING INDEXES clause, youare askingoracle to exchange all the local indexes defined with a target index, then for each local index
defined, there must be a local or non-partitioned index equivalent. If its not the case, you get the ORA-14098 code. This constraint doesn'taffect the Global Indexes which becomes UNUSABLE except if the UPDATE GLOBAL INDEXES clause is used.


When you exchange partitions, you need to have indexes on the exchange table that match to each local index on the partitioned table. That means if you have N local indexes on the partitioned table, you also need N equivalent indexes on the exchange table.   It also means the column position, type, and size have to be the same for each index's counterpart.

At first glance, it looks like the conditions are met.  In this case, however, the primary key index on the partitioned table is actually a global index, not a local index.   Therefore we are short by one local index on the exchange, and the ORA-14098 is raised.

回复 只看该作者 道具 举报

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

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-24 04:18 , Processed in 0.048838 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569