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

Migrating table with composite partition (Hash/Range) to different tablespace

正在尝试将 table tab 从 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查询的过程。 例如,

ALTER TABLE tab_name MOVE PARTITION P201102 TABLESPACE newTbs;

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

SQL Error: ORA-14257: cannot move partition other than a Range, List, System, or Hash partition

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

为上述场景迁移分区需要正确的 alter 语句语法。

您可以 move subpartitions 但不能创建包含子分区的分区。 (稍后,您可以移动段。)

ALTER TABLE tab_name MOVE SUBPARTITION SYS_SUBP5225 TABLESPACE newTbs;

UPDATE:如果你想更改新分区的创建位置,那么 运行 下面的 ddl,它会更改 table 的属性 -创建新分区的位置。

 alter table tab_name modify default attributes tablespace newTbs;

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

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