【问题标题】:updating partition Key, row movement not allowed更新分区键,不允许行移动
【发布时间】:2022-05-11 20:36:50
【问题描述】:

我想更新一个分区键。分区如下

PARTITION_NAME  LAST_ANALYZED   NUM_ROWS    BLOCKS  SAMPLE_SIZE HIGH_VALUE
PORTAL_SERVICE_1    12/8/2016   4133    174 4133    1
PORTAL_SERVICE_2    6/8/2016    4474    174 4474    2
PORTAL_SERVICE_3    10/8/2016   29602   2014    29602   3
PORTAL_SERVICE_OTHERS   24/5/2016   0   110     DEFAULT

此分区应用于 Portal_Service_id 列。我想将门户服务 ID 的值从 2 更新为 1。

当我尝试时

update trans set PORTAL_SERVICE_ID = 1 where ID = 2054;

我得到错误: 错误报告 - SQL 错误:ORA-14402:更新分区键列会导致分区更改 14402. 00000 - “更新分区键列会导致分区更改”

我不允许使用启用行移动。

任何人都可以建议任何替代方法来更新该行。

如果可以在场景中使用,任何人都可以提供一些启示:

UPDATE <table_name> PARTITION (<partition_name>)
SET <column_name> = <value>
WHERE <column_name> <condition> <value>;

【问题讨论】:

  • 为什么你在一个 Oracle 问题上有mysql 标签。
  • 由于您不允许行移动,您需要删除旧行并插入新行而不是更新。
  • 我使用常规删除吗?我问的原因是我不能直接在 prod db 中检查这个,并且 test db 没有 hv 分区...... proj 设置很烂!!!
  • 是的,定期删除。您需要先将旧行内容保存在应用程序中,以便之后插入。
  • @Barmar 似乎删除也不是一个选项。我需要以某种方式更新.. :(

标签: oracle sql-update partitioning database-partitioning


【解决方案1】:

要解决错误“ORA-14402:更新分区键列会导致分区更改”,您可以按照以下步骤操作

1) 检查您的表是否启用了 row_movement

SELECT owner, table_name, row_movement FROM dba_tables WHERE table_name in ('YOUR_TABLE');

2) 如果禁用,您可以使用此脚本启用移动

alter table YOUR_TABLE enable row movement;

之后你可以更新分区键列

【讨论】:

    【解决方案2】:

    在搜索 ORA-14402 时,我发现这个问题是 Google 搜索结果中排名靠前的问题。在我的特殊情况下,我:

    1. 将行导出为插入语句
    2. 更新了索引键字段,更新了ID字段
    3. 将这些行作为新行插入。

    如果需要,您可以删除旧行或将它们保留在旧分区中。

    【讨论】:

      【解决方案3】:

      使用此语法启用行移动,它将解决错误:

      alter table 启用行移动

      【讨论】:

        【解决方案4】:

        大多数其他答案都指出了解决方案的一部分,即:

        alter table <table_name> enable row movement
        

        然而,它的意义远不止于此。启用行移动有一些权衡,这里指出:http://www.dba-oracle.com/t_enable_row_movement.htm

        就我而言,这让我仔细检查了为什么我们首先要使用分区。理想情况下,分区用于存储一旦进入分区就不会移动的数据。如果您正在修改分区字段(在我的情况下是时间戳),那么这可能意味着您不应该使用分区。如果您确定要在可变字段上进行分区,那么至少要确保定期运行:

        "alter table shrink compact"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-14
          • 2017-08-25
          • 1970-01-01
          • 2015-05-13
          • 1970-01-01
          • 2016-01-10
          • 2022-10-04
          相关资源
          最近更新 更多