查看: 14487|回复: 14

oracle分区问题:更改分区键值列的数据,导致ORA-14402错误

[复制链接]
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB元老
日期:2005-11-28 14:14:452010新春纪念徽章
日期:2010-03-01 11:20:05
发表于 2004-11-1 11:30 | 显示全部楼层 |阅读模式
请问,有什么风险最小的方法来解决?
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
发表于 2004-11-1 11:38 | 显示全部楼层
alter table xxx enable row_movement;

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB元老
日期:2005-11-28 14:14:452010新春纪念徽章
日期:2010-03-01 11:20:05
 楼主| 发表于 2004-11-1 12:11 | 显示全部楼层
最初由 xzh2000 发布
[B]alter table xxx enable row movement; [/B]

刚才试验了,解决了。但是不知道这个是什么原理?对分区表有什么影响。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
发表于 2004-12-23 15:03 | 显示全部楼层
顶 有人知道么?如何解决ORA-14402

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
发表于 2004-12-23 15:04 | 显示全部楼层
Question: Why am I getting an ora-14402 error when I update a partition key
Answer: You cannot update the value of the partition key, the only way you can go about this is by deleting the old row and adding a new row to the table

难道只能重新insert?

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
发表于 2004-12-23 15:08 | 显示全部楼层
最初由 xzh2000 发布
[B]alter table xxx enable row_movement; [/B]


ok 问题解决了

from asktom:


It is possible to update a partition key in all releases -- what is not possible
to do prior to 8i is to update the partition key in such a fashion as to cause
it to move from partition to partition.  For example:

ops$tkyte@8.0> CREATE TABLE partitioned
  2  ( x int,
  3    y int,
  4    z DATE
  5  )
  6  PARTITION BY RANGE (z)
  7  (
  8  PARTITION part_1 VALUES LESS
           THAN(to_date('01-jan-1995','dd-mon-yyyy')),
  9  PARTITION part_2 VALUES LESS
           THAN(to_date('01-jan-1996','dd-mon-yyyy'))
10  )
11  /

Table created.

ops$tkyte@8.0>
ops$tkyte@8.0> insert into partitioned values
  2  ( 1, 1, to_date('01-jan-1994','dd-mon-yyyy') );

1 row created.

ops$tkyte@8.0>
ops$tkyte@8.0> insert into partitioned values
  2  ( 2, 1, to_date('01-mar-1995','dd-mon-yyyy') );

1 row created.

ops$tkyte@8.0>
ops$tkyte@8.0> commit;

Commit complete.

ops$tkyte@8.0>
ops$tkyte@8.0> update partitioned set
  2           z = to_date('01-jan-1993')
               where z = to_date('01-jan-1994')
  3  /

1 row updated.

That shows we CAN update a partition key in 8.0

ops$tkyte@8.0> rollback;

Rollback complete.

ops$tkyte@8.0>
ops$tkyte@8.0> update partitioned set
  2  z = decode( x, 1, to_date('01-mar-1995','dd-mon-yyyy'),
  3              2, to_date('01-jan-1994','dd-mon-yyyy') )
  4  /
update partitioned set
       *
ERROR at line 1:
ORA-14402: updating partition key column would cause a partition change

But we cannot have it migrate.  Now, in Oracle8i, release 8.1 we can:

ops$tkyte@8i> CREATE TABLE partitioned
  2  ( x int,
  3    y int,
  4    z DATE
  5  )
  6  PARTITION BY RANGE (z)
  7  (
  8  PARTITION part_1 VALUES LESS
         THAN(to_date('01-jan-1995','dd-mon-yyyy')),
  9  PARTITION part_2 VALUES LESS
         THAN(to_date('01-jan-1996','dd-mon-yyyy'))
10  )
11  ENABLE ROW MOVEMENT
12  /

Table created.

Enable row movement will allow us to update a partition key and have it move
from partition to partition

ops$tkyte@8i>
ops$tkyte@8i> insert into partitioned values
  2  ( 1, 1, to_date('01-jan-1994','dd-mon-yyyy') );

1 row created.

ops$tkyte@8i>
ops$tkyte@8i> insert into partitioned values
  2  ( 2, 1, to_date('01-mar-1995','dd-mon-yyyy') );

1 row created.

ops$tkyte@8i>
ops$tkyte@8i> commit;

Commit complete.

ops$tkyte@8i>
ops$tkyte@8i> select rowid, a.* from partitioned a;

ROWID                       X          Y Z
------------------ ---------- ---------- ---------
AAAWBlAADAAAIfKAAA          1          1 01-JAN-94
AAAWBmAADAAAIgKAAA          2          1 01-MAR-95

ops$tkyte@8i> update partitioned set
  2  z = decode( x, 1, to_date('01-mar-1995','dd-mon-yyyy'),
  3              2, to_date('01-jan-1994','dd-mon-yyyy') )
  4  /

2 rows updated.

ops$tkyte@8i> select rowid, a.* from partitioned a;

ROWID                       X          Y Z
------------------ ---------- ---------- ---------
AAAWBlAADAAAIfKAAB          2          1 01-JAN-94
AAAWBmAADAAAIgKAAB          1          1 01-MAR-95

ops$tkyte@8i> commit;

Commit complete.


but -- notice the side effect -- the rows ROWID changed, one of 2 cases in
Oracle8i release 8.1 whereby for the first time a rowid of a row will change
(index organized tables are the other case -- if you update the primary key)

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
发表于 2004-12-23 15:11 | 显示全部楼层
对请问tom说的最后两句是什么意思?副作用怎么解释?

but -- notice the side effect -- the rows ROWID changed, one of 2 cases in
Oracle8i release 8.1 whereby for the first time a rowid of a row will change

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
发表于 2004-12-23 15:13 | 显示全部楼层
the rowid changes - it is just like delete + insert
--- from tom. hehe

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
发表于 2004-12-23 15:16 | 显示全部楼层
I came to this page after getting the "ORA-14402: updating partition key column
would cause a partition change" error message.  I then tried ALTER TABLE xYz
ENABLE ROW MOVEMENT and, like a miracle, my problems fizzled away!  I learnt a
new thing too after 15 years of using oracle.  Thanks Tom.

呵呵 夸张了点.
总觉得解决一个问题后很兴奋.

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2004-12-23 15:46 | 显示全部楼层
rowid发生变化一般问题不大。但是需要注意几点,如果你在程序中保存了rowid,并把这个rowid用于查询,那么rowid的变化则会是一个问题。另外,在使用logminer时,rowid的变化可能会导致使用logminer的undo信息无法还原数据。
至于分区表的enable row movement会不会影响到logminer的使用还不敢确定。

使用道具 举报

回复

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

本版积分规则 发表回复

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