miércoles, 2 de septiembre de 2009

Mover columna LOB a otro tablespace

Mover una tabla de un tablespace a otro puede resultar tan sencillo como ejecutar la sentencia:

alter table TABLA_SIMPLE move tablespace TS_DESTINO;

Pero... qué sucede si esta tabla contiene un atributo de tipo CLOB?
Cuando se crea una tabla con un atributo de tipo CLOB, Oracle implícitamente crea un segmento LOB y un índice LOB para dicha columna. Los nombres que asigna Oracle para estos objetos son, SYS_LOBxxxx para los segmentos y SYS_ILxxxx para los índices.
Aquí va la receta para mover la tabla conjuntamente con ese índice y segmento LOB...

Supongamos que la tabla en cuestión se llama TABLA_LOB.

Ahora, verificamos el segmento, el índice y la columna asociada al campo lob de dicha dicha tabla:

select segment_name, index_name, column_name from user_lobs where table_name='TABLA_LOB';

SEGMENT_NAME   INDEX_NAME   COLUMN_NAME
--------------------------   ---------------------   ------------------------
SYS_LOB0000760032C00019$$   SYS_IL0000760032C00019$$   COLUMN_LOB

Movemos la tabla TABLA_LOB al tablespace que deseamos:

alter table TABLA_LOB move tablespace TS_LOB;

Con ésto hemos logrado, como ya sabíamos, mover la tabla TABLA_LOB al tablespace requerido, pero el segmento LOB aún permanece en el tablespace de origen.

Para mover el segmento debemos ejecutar el siguiente sql:

alter table TABLA_LOB move lob (COLUMN_NAME) store as (tablespace TS_LOB);

Verificamos:

select index_name, tablespace_name from user_indexes where table_name = ‘TABLA_LOB’;

INDEX_NAME   TABLESPACE_NAME              
---------------------   -------------------------------
SYS_IL0000760032C00019$$   TS_LOB


Está listo, conseguimos mover el dichoso segmento!

2 comentarios:

  1. Hola qué tal:

    Antes que nada muchas gracias por el proceso descrito, lo he aplicado en Oracle9i y funcionó correctamente para una tabla.

    Sin embargo, al querer mover el LOB segment de una segunda tabla, me arroja el siguiente error: "ORA-01652: unable to extend temp segment by 8192 in tablespace PSATTACH".

    ¿Necesito modificar algo en el tablespace PSATTACH (es el tablespace a donde estoy pasando las tablas con LOB segments)?

    Ojalá puedas apoyarme y orientarme al respecto. De antemano gracias.

    Saludos!

    ResponderEliminar
  2. Qué tal Jesus?
    Me alegro que te haya servido en algo este post.
    En cuanto al problema que estás teniendo con el tablespace PSATTACH, me suena a que está quedando chico en espacio. Quizás puedas chequear que el o los datafiles que componen el tablespace tengan la propiedad AUTOEXTEND ON... Y la otra posibilidad es agregar un nuevo datafile al tablespace PSATTACH.
    Suerte y saludos.

    ResponderEliminar