Como destruir tablespace con particiones y subparticiones

Problema

No se puede destruir un tablespace con una tabla partida antes de destruir las subparticiones y las particiones primero.

in English

No se puede destruir un tablespace con tablas partidas (partitioning) con la instrucción DROP TABLESPACE
SQL> drop tablespace DATA_PARTS_2011Q1;
drop tablespace DATA_PARTS_2011Q1
*
ERROR at line 1:
ORA-01549: tablespace not empty, use INCLUDING CONTENTS option
Si el tablespace tiene tablas partidas, tampoco se pueden destruir estas tablas.  Es necesario destruir las subparticiones primero, luego las particiones, entonces la tabla, y ya finalmente el tablespace.

Solución

Antes que nata, hay que determinar los objectos del tablespace.  Los segmentos, extents, tablas, índices, las particiones y subparticiones de estas tablas e índices.
Estas querys listarán todos los objectos del tablespace:
select * from dba_segments
where tablespace_name = ‘DATA_PARTS_2012Q’;select * from dba_extents
where tablespace_name = ‘DATA_PARTS_2011Q’;

select * from dba_tables
where tablespace_name = ‘DATA_PARTS_2011Q’;

Y ahora, las particiones:

select * from DBA_TAB_PARTITIONS
where tablespace_name = ‘DATA_PARTS_2011Q’;

select * from DBA_TAB_SUBPARTITIONS
where tablespace_name = DATA_PARTS_2011Q’;

En caso de índices e índices partidos:

select * from dba_indexes
where tablespace_name = ‘DATA_PARTS_2011Q’;

select * from DBA_IND_PARTITIONS
where tablespace_name = ‘DATA_PARTS_2011Q’;

En caso de subparticiones:

select * from DBA_IND_SUBPARTITIONS
where tablespace_name = ‘DATA_PARTS_2011Q’;

select * from DBA_TAB_SUBPARTITIONS
where tablespace_name = ‘DATA_PARTS_2011Q1’;

Primero se destruyen las subparticiones

Esta query genera las instrucciones para destruir las subparticiones:
select ‘ALTER TABLE ‘ || TABLE_OWNER || ‘.’ || TABLE_NAME || ‘ DROP SUBPARTITION ‘ || SUBPARTITION_NAME  || ‘;’
from DBA_TAB_SUBPARTITIONS
where tablespace_name = ‘DATA_PARTS_2011Q1’;

Ahora se corren las instrucciones para destruir las subparticiones:
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP SUBPARTITION D1MSRMTLOGPARM_201103_SUB6;
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP SUBPARTITION D1MSRMTLOGPARM_201103_SUB7;
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP SUBPARTITION D1MSRMTLOGPARM_201103_SUB8;

Se debe hacer lo mismo en caso de índeces con subparticiones (DBA_IND_SUBPARTITIONS.)

Este error es normal.  Oracle no destruye la última subpartición de una partición.
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP SUBPARTITION D1MSRMTLOGPARM_201103_SUB8
*
ERROR at line 1:
ORA-14629: cannot drop the only subpartition of a partition

Esta query genera las instrucciones para destruir las particiones:
select  ‘ALTER TABLE ‘ || TABLE_OWNER || ‘.’ || TABLE_NAME || ‘ DROP PARTITION ‘ || PARTITION_NAME  || ‘;’
from DBA_TAB_PARTITIONS
where tablespace_name = ‘DATA_PARTS_2011Q’;

Corra las instrucciones para destruir las particiones:
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP PARTITION D1MSRMTLOGPARM_201103;
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP PARTITION D1MSRMTLOGPARM_201102;
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP PARTITION D1MSRMTLOGPARM_201101;
ALTER TABLE CISADM.D1_MSRMT_LOG_PARM DROP PARTITION D1MSRMTLOGPARM_201012;

Se debe hacer lo mismo en caso de índices partidos (DBA_IND_PARTITIONS.)

Ahora sin particiones, la tabla se puede destruir:

DROP TABLE D1_MSRMT_LOG_PARM;

Finalmente, el tablespace se puede destruir:

DROP TABLESPACE DATA_PARTS_2011Q;

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s