Solución:
Estoy de acuerdo con el comentario de EdStevens, pero aquí hay algunas otras ideas:
El sitio web de AskTom tiene un script que enumerará exactamente cuánto puede reducir los archivos de datos existentes.
Si eso no genera muchos ahorros, puede encontrar los índices más grandes en ese espacio de tabla y reconstruirlos; esa es una solución temporal y los índices eventualmente volverían a ser grandes, pero si el presupuesto no permite más espacio en el disco ahora, intente esta consulta:
select segment_name, sum(bytes)/1024/1024 as mb
from dba_segments
where tablespace_name="TB1" and segment_type like 'INDEX%'
group by segment_name
order by mb;
Entonces, si encuentra un índice llamado ind_big_stuff
es enorme, entonces
alter index ind_big_stuff rebuild online;
Además, si su aplicación es una aplicación comercial, puede haber varias tablas con cero filas. O si tiene tablas particionadas, puede tener algunas particiones con cero filas. Puede soltar el espacio asignado a ellos con
exec dbms_space_admin.drop_empty_segments(schema_name=>'HR');
Puedes usar el segment creation deferred
cláusula en una declaración de tabla de modificación para cosas como tablas particionadas o tablas que sabe que no tendrán filas.
Creo que hay cinco métodos para solucionar este problema de mantenimiento de Oracle:
- Reorganización en línea: el paquete de reorganización de tablas en línea de Oracle (dbms_redefinition) se utiliza para reorganizar las tablas mientras aceptan actualizaciones. Conserva las definiciones de índice y restricción. (Solo Enterprise Editon). Sin tiempo de inactividad.
- Alterar el espacio de encogimiento de la tabla: el uso del comando Alterar el encogimiento del espacio de encogimiento de la tabla volverá a empaquetar las filas, bajará el HWM y liberará las extensiones no utilizadas. El psiquiatra solo compacta los datos. No garantiza que los bloques se colocarán al principio del archivo de datos, por lo que es posible tener bloques al final del archivo de datos, lo que significa que el tamaño del archivo de datos no se puede reducir. Conserva las definiciones de índice y restricción. Sin tiempo de inactividad.
- Bomba de datos (expdp, impdp): método sin conexión para transferir datos y reorganizar tablas. Conserva las definiciones de índice y restricción. Se requiere tiempo de inactividad.
- Alterar el movimiento de la tabla: el comando Alterar el movimiento de la tabla mueve las filas hacia abajo en el espacio no utilizado y ajusta el HWM pero no ajusta la extensión de los segmentos, y el tamaño de la tabla sigue siendo el mismo. La sintaxis alter table move también conserva las definiciones de índice y restricción. Es necesario cambiar el tamaño del archivo de datos. Se requiere tiempo de inactividad.
- Crear tabla como selección (CTAS): copia las filas de la tabla en un área limpia, lo que reduce la marca de agua superior, empaqueta las filas densamente (según lo dicta PCTFREE) y libera espacio libre. Es necesario cambiar el tamaño del archivo de datos. Se requiere tiempo de inactividad.
Busqué una respuesta a esto y finalmente la encontré:
- (opcionalmente) elimine las tablas no utilizadas (eliminadas) del espacio de tabla:
PURGE TABLESPACE table_space_name;
- limpiar el espacio de tabla:
ALTER TABLESPACE table_space_name COALESCE;
- finalmente, cambie el tamaño de los archivos de datos:
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/file1.dbf' RESIZE 100M;
PD: No estoy seguro sobre el tiempo de inactividad, alguien verifique eso.
PPS: para los espacios de tabla TEMP, utilice:
-
ALTER TABLESPACE TEMP SHRINK SPACE ;
(opcionalmente agregarKEEP 512M
o similar) - cambiar el tamaño de los datos / archivos temporales:
ALTER DATABASE TEMPFILE '/u02/oracle/rbdb1/temp01.dbf' RESIZE 512M;