【问题标题】:Migrating table with composite partition (Hash/Range) to different tablespace将具有复合分区(哈希/范围)的表迁移到不同的表空间
【发布时间】:2016-03-09 08:54:52
【问题描述】:

试图将表 tab 从表空间 oldTs 移动到 newTs。选项卡上有一个复合分区(范围/哈希)。因此,直接的“Alter-Table-Move-Tablespace”查询将不起作用,需要逐个分区迁移。下面是tab的SQL:

CREATE TABLE tab
(
    col_1 char(6),
    col_2 varchar2(4),
    col_3 varchar2(5)
)
TABLESPACE oldTs PARTITION BY RANGE
(
    "col_1"
)
SUBPARTITION BY HASH
(
    "col_2"
)
SUBPARTITIONS 1
(
    PARTITION "P201102" VALUES LESS THAN ('201103') PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255 STORAGE( BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "oldTs" NOCOMPRESS NOLOGGING ( SUBPARTITION "SYS_SUBP5223" TABLESPACE "oldTs" NOCOMPRESS , SUBPARTITION "SYS_SUBP5224" TABLESPACE "oldTs" NOCOMPRESS ),
    PARTITION "P201103" VALUES LESS THAN ('201104') PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255 STORAGE( BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "oldTs" NOCOMPRESS NOLOGGING ( SUBPARTITION "SYS_SUBP5225" TABLESPACE "oldTs" NOCOMPRESS , SUBPARTITION "SYS_SUBP5226" TABLESPACE "oldTs" NOCOMPRESS )
);

有几个这样的每月分区,创建了一个获取所有分区名称(例如 P201102、P2001103)并为移动分区生成更改查询的过程。 例如,

ALTER TABLE tab_name MOVE PARTITION P201102 TABLESPACE newTbs;

但是,查询给出以下错误:

SQL 错误:ORA-14257:无法移动除 Range、List、 系统或哈希分区

此外,如果您在 P201102/P201103 中注意到,每个子分区都有两个子分区(P201103 的 SYS_SUBP5225 和 SYS_SUBP5226)。

在上述情况下迁移分区时需要使用正确的 alter 语句语法。

【问题讨论】:

    标签: oracle oracle11g partition tablespace


    【解决方案1】:

    您可以move subpartitions,但不能使用包含子分区的分区。 (简而言之,您可以移动段。)

    ALTER TABLE tab_name MOVE SUBPARTITION SYS_SUBP5225 TABLESPACE newTbs;
    

    更新:如果您想更改创建新分区的位置,请运行下面的 ddl,它会更改表的属性 - 创建新分区的位置。

     alter table tab_name modify default attributes tablespace newTbs;
    

    UPDATE2:如果要更改为分区创建子分区的位置,请在下面运行更改分区的属性 - 创建新子分区的位置:

    alter table tab_name modify default attributes for partition P201102 tablespace newTbs;
    

    【讨论】:

    • 已经试过了,移动了两个子分区,比如:ALTER TABLE tab_name MOVE SUBPARTITION SYS_SUBP5225 TABLESPACE newTbs;ALTER TABLE tab_name MOVE SUBPARTITION SYS_SUBP5226 TABLESPACE newTbs; 但是,这只改变了子分区的表空间,旧的表空间还在反射:PARTITION "P201103" VALUES LESS THAN ('201104')...TABLESPACE "**oldTs**" NOCOMPRESS NOLOGGING( SUBPARTITION "SYS_SUBP5225" TABLESPACE "newTs" NOCOMPRESS ,SUBPARTITION "SYS_SUBP5226" TABLESPACE "newTs" NOCOMPRESS )
    • 不太明白这是做什么用的,可以举个例子吗?
    • 它只是改变了表格的一个属性。将在那里创建新的分区。如果要移动现有分区,则应使用move
    • 知道了。但是,即使在移动子分区之后,旧表空间 oldTs 仍然存在:PARTITION "P201103" VALUES LESS THAN ('201104')...TABLESPACE "**oldTs**" NOCOMPRESS NOLOGGING( SUBPARTITION "SYS_SUBP5225" TABLESPACE "newTs" NOCOMPRESS ,SUBPARTITION "SYS_SUBP5226" TABLESPACE "newTs" NOCOMPRESS )
    • 当然,这很简单。使用所需过滤器从所有/dba/user_segments 中选择 *。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多