martes, 31 de marzo de 2009

Reducir el tamaño de los datafiles

Antes que nada hablemos porque quicieramos reducir el tamaño, pueden pasar 2 cosas:
a) creamos el datafile de un tamaño que nunca vamos a llegar y por eso lo queremos reducir
b) lo creamos autoextend y por lo tanto cuando insertamos aumenta su tamaño, pero luego al borrar las filas o tablas .....NO RECUERA EL TAMAÑO !!!!

Para reducir el tamaño ORACLE proporciona el comando RESIZE, pero ya veremos que no es "muy inteligente".

Para saber cuanto espacio tenemos disponible y candidato a achicar se puede ejecutar la siguiente cosulta:

select dba_data_files.file_id, dba_data_files.file_name , sum(dba_free_space.bytes)/1024/1024 mega
from dba_free_space, dba_data_files
where dba_free_space.file_id = dba_data_files.file_id
group by dba_data_files.file_id, dba_data_files.file_nam
e

y por ejemplo da el siguiente resultado:

3 C:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF 10
5 C:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF 20
1 C:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF 6,01
2 C:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF 150.3
4 C:\ORACLE\ORADATA\ORCL\USERS01.DBF 100.7


Esta consulta devuleve el espacio libre que hay, por lo que como máximo podrías bajar 100 Mg. y monedas, del datafile users01.dbf

OJO!!!!
En REALIDAD, lo que te devuelve el tamaño libre a partir de todas las HWM (high water mark) de las tablas, es decir el tamaño máximo que tuvieron alguna vez.


Por ejemplo la tabla t tiene 10m de datos y 10mg de “huecos” el espacio libre se calcula como si la tabla tuviera 20m. se entiende?

En otras palabras, se podría bajar 100mg de tu datafile USERS01.DBF. si tener que lidiar con los huecos.

Bueno.. esto es util si NO TENEMOS HUECOS.... cosa que NUNCA PASA !!!!! la vida no puede ser tan sensilla :D

Entonces que hacemos:
Bueno.. existen 2 opciones:

a) el magico "SHRINK" que por desgracia solo aplica a tablas y tablespaces temporales. no a los de datos :(

b) mover los datos a un nuevo datafile y borrar el anterior.

veamos cada una de las opciones


Nota: Si tenes metalink y queres algo más de info, podes ver las siguientes notas de nuestros amigos de ORACLE:

Nota: 1029252.6 - How to Resize a Datafile
Nota: 130866.1 - How to Resolve ORA-03297 When Resizing a Datafile by Finding the Table Highwatermark
Nota: 237654.1 - Resizing a Datafile Returns Error ORA-03297