将具有复合分区(Hash / Range)的表迁移到不同的表空间

时间:2015-12-04 12:09:50

标签: oracle oracle11g partition tablespace

尝试将表格标签从表格空间 oldTs 移至 newTs 。选项卡上有一个复合分区(Range / Hash)。因此,直接“Alter-Table-Move-Tablespace”查询将无法工作,需要按分区迁移分区。下面是选项卡的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语法的正确语法来迁移上述方案的分区。

1 个答案:

答案 0 :(得分:2)

您可以move subpartitions但不能包含子分区的分区。 (很快,您可以移动细分。)

ALTER TABLE tab_name MOVE SUBPARTITION SYS_SUBP5225 TABLESPACE newTbs;

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

 alter table tab_name modify default attributes tablespace newTbs;

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

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