Recuperar espacio en un tablespace con datos Blob

Oracle derrocha bastante espacio de almacenamiento de disco. Al modificar o borrar registros lo lógico seria que se liberase espacio pero Oracle lo conserva para posibles futuros usos de ese mismo objeto. El principal motivo es que se prima el rendimiento, relegando la recuperación del espacio no empleado a tareas de mantenimiento.

Recuperar este espacio es sencillo para tablas normales. Probablemente la mejor manera es realiza un move tablespace de la tabla. Antiguamente estaba el par exp/imp.

El problema surge en la gestión de datos tipo BLOB que no comparten el almacenamiento en disco con el resto de los campos del registro y en caso de borrado no libera los bloques empleados pese a haber eliminado el registro. La unica solución es realizar este proceso de mantenimiento campo a campo.

Tomemos por ejemplo una tabla, T, con 3 campos y todos de tipo BLOB, (X, Y, Z). Diponemos de 2 tablespaces para realizar las tareas auxiliares LOBTEST y LOBTEST2.

Es sencillo comprobar el espacio que incialmente usado en ambos tablespaces es:

Select Sum (Bytes) / 1024 / 1024, segment_name, segment_type
From user_segments
Where tablespace_name Like 'LOBTEST%'
Group By segment_name, segment_type;
(1)

Así pues la operativa de mantenimiento es:

ALTER TABLE t MOVE LOB(x) STORE AS ( TABLESPACE lobtest2 );
ALTER TABLE t MOVE LOB(y) STORE AS ( TABLESPACE lobtest2 );
ALTER TABLE t MOVE LOB(z) STORE AS ( TABLESPACE lobtest2 );

(… suponiendo los objetos almacenados en lobtest)

Con estas instrucciones habremos recuperado el espacio libre bloqueado. Se puede comprobar el espacio consumido con la misma consulta (1). Por ultimo y dependiendo de la politica de almacenamiento quedaria devolver los objetos ya “compactados” al su tablespace original: de LOBTEST a LOBTEST2 por el mismo mecanismo descrito.

Intersante:

  • Si se dispone de suficiente espacio en el tablespace es posible reconstruir el objeto utilizando el mismo tablespaces
  • Como se puede observar, dado este consumo desmesurado de espacio es recomendable almacenarlo en tablespaces separados.
  • Desde la versión 10 existen mejores metodos de monitorización y recuperación de espacio como el “consejero de almacenamiento”. En cualquier caso estas técnicas siguen siendo operativas.
  • No se tiene en cuenta la gestión del almacenamiento con ASM
  • Matando sesiones con seguridad

    El método más seguro de matar una sesión es desde una sesión del administrador de la bbdd. Con alguna referencia sobre el proceso a matar se realiza una búsqueda con la consulta:

    SELECT s.sid, s.serial#, s.osuser, s.program
    FROM v$session s;

    Con el sid y serial# se lanza la instrucción:

    ALTER SYSTEM KILL SESSION 'sid,serial#';

    Es posible que el proceso no termine con facilidad, por lo que conviene lanzar esta misma llamada con el modificador IMMEDIATE. De este modo el proceso fuerza también, de un modo seguro, la finalización del proceso del sistema operativo.

    ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

    Este es el único método seguro ya que si se opta por matar directamente la sesión del sistema operativo es posible que se vea afectada la integridad de los datos.

    No obstante en situaciones de autentica necesidad se podrá también matar los procesos del sistema operativo.

    Para sistemas Unix el clásico KILL -9 {spid} o desde windows orakill {sid} {spid}, donde {spid} se deduce del cruce de v$session y v$process y el {sid} es el identificador de la bbdd.