2010-06-14 13 views
5

Tengo un tablespace LOB. Actualmente tiene 9GB de 12GB disponibles. Y, hasta donde puedo decir, eliminar registros no recupera ningún almacenamiento en el tablespace. (Esto fue por el método simple de monitoreo de almacenamiento - consultas en contra de user_extents, que es todo lo que tengo permitido como no DBA) Me preocupa la posibilidad de seguir procesando.Cómo recuperar el almacenamiento para los LOB eliminados

Mi preocupación simplemente se está quedando sin espacio: estamos a 9 GB de 12 GB disponibles para el tablespace y quiero descubrir cómo recuperar espacio antes de pedir más.

Las columnas LOB se almacenan en un espacio de tablas separado, aunque se permite "almacenamiento en fila" para las pequeñas.

Esto es Oracle 11.1 y los datos están en una columna CLOB y BLOB en la misma tabla. Los segmentos del índice LOB (SYS_IL ...) son pequeños, todo el almacenamiento está en los segmentos de datos (SYS_LOB ...)

Probamos a purgar y nos reunimos y no llegamos a ninguna parte: el mismo número de bytes en user_extents.

"Alter table xxx move" funcionará, pero necesitaríamos tener un lugar donde moverlo para que tenga suficiente espacio para los datos revisados. También necesitaríamos hacer eso fuera de horas y reconstruir los índices, por supuesto, pero eso es bastante fácil.

Copiar los buenos datos y hacer un truncado, y luego copiarlo de nuevo, también funcionará. Pero eso es más o menos lo que hace el comando "alterar tabla".

¿Faltan algunas formas fáciles de reducir las cosas y recuperar el almacenamiento? ¿O es "alter table xxx move" el mejor enfoque? ¿O no es un problema y Oracle recuperará el espacio de las filas de lob borradas cuando lo necesite?

+0

"que es todo lo que me permite como un no-DBA" no pude dejar de notar esto, y vale la pena decir que no todos los problemas técnicos tiene una respuesta técnica. Si usted es quien está a cargo de preocuparse por estas cosas, se le deben otorgar permisos de DBA o al menos el privilegio de SELECCIONAR CUALQUIER DICCIONARIO. Si no lo eres, deberías escalar algo como esto antes de que afecte a otros usuarios. – durette

Respuesta

1

Generalmente, una vez que se asigna una extensión a una tabla, permanece asignada. El espacio vacío dentro de una tabla puede reutilizarse si se insertan datos adicionales en la tabla. Sin embargo, es difícil reclamar espacio desde una tabla porque la tabla puede tener, por ejemplo, los bloques 1 a 100, y los bloques vacíos están en los bloques 50-75, o los bloques vacíos son 1,3,5,7, etc.

La pregunta es, ¿le preocupa que se reutilice el espacio dentro de la tabla o necesita el espacio liberado para otros objetos en el tablespace, o necesita poder reducir los archivos de datos tablespace?

6

Esta pregunta es antigua, pero nunca tuvo una respuesta funcional y puede ser útil para mucha gente, así que aquí la solución que encontré al enfrentar este problema.

Tiene razón, eliminar el LOB no recuperará ningún almacenamiento en el tablescape.

ejecución de esta consulta antes y después de eliminar LOB dará el mismo resultado

select bytes 
    from user_segments 
    where tablespace_name = yourTableSpace 
     and segment_name = yourTableName; 

lectura this Oracle doc, descubrí que es necesario ejecutar la siguiente declaración

ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE); 

que se encogerá un segmento de LOB BASICFILE.

Ahora si vuelve a ejecutar la consulta

select bytes 
    from user_segments 
    where tablespace_name = yourTableSpace 
     and segment_name = yourTableName; 

Usted se dará cuenta de que el espacio se han lanzado al espacio de tablas, y será capaz de volver a utilizar ese espacio como lo hubiera querido.

Ahora, para aquellos que deseen liberar espacio en el disco, tenga en cuenta que el archivo de datos no cambiará de tamaño automáticamente y aún mantendrá el tamaño completo en su disco.

Pero antes de la modificación del tamaño del fichero de datos, asegúrese de desasignar espacio no utilizado en un segmento (lo robó del mismo documento como se dijo antes) el uso de estas consultas (use el que necesita)

ALTER TABLE table DEALLOCATE UNUSED KEEP integer; 
ALTER INDEX index DEALLOCATE UNUSED KEEP integer; 
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer; 

Nota que la cláusula KEEP es opcional y le permite especificar la cantidad de espacio retenido en el segmento. Puede verificar que el espacio desasignado se libere examinando la vista DBA_FREE_SPACE.

Ahora para cambiar el tamaño de su archivo de datos,

ALTER DATABASE DATAFILE yourDatafile.dbf resize 500M 

Tenga en cuenta que el tamaño máximo que puede reducir el tamaño al cambiar el tamaño se basa en la posición del último bloque de datos en el archivo de datos. Por lo tanto, hay muchas posibilidades de que después de la eliminación de una gran cantidad de datos no se pueda cambiar el tamaño. Entonces, la forma más fácil es exportar los datos y volver a importarlos en otro espacio de tabla, luego descartar el antiguo espacio de tablas. Al importar los datos, Oracle los empacará tanto como sea posible.

Si desea liberar aún más espacio, puede borrar el tablespace temporal que a veces ocupa mucho espacio (5 GB para mi base de datos). Utilice la siguiente instrucción para comprobar que el tamaño:

SELECT tablespace_name, file_name, bytes 
    FROM dba_temp_files WHERE tablespace_name like 'TEMP%'; 
+0

No se olvide de habilitar el movimiento de fila si aún no está habilitado: ALTER TABLE x_tab ENABLE ROW MOVEMENT; – durette

Cuestiones relacionadas