jueves, 28 de mayo de 2009

DBA_FREE_SPACE miente a veces

Buenas de nuevo, con un nuevo test sobre una funcionalidad de la Oracle 10g:

LA PAPELERA

Si deseas usar el FLASHBACK TABLE, debes tener habilitada la papelera para que en caso tal que borres la tabla puedas recuperar si la borraste. Pues bien, el caso es que, hace un rato me dicen que un índice no se puede crear porque no se puede extender un segmento temporal. El típico ORA-01652 ó ORA-01653 ó ora-01654.
Lo primero que piensas es en que se quedó sin espacio, y no, tenía 600M libres (según la DBA_FREE_SPACE), lo siguiente que te planteas, es que en el momento de crear un índice se crea un segmento temporal para realizar las ordenaciones necesarias para la creación del índice, y sea esta ejecutando una consulta gigante, y no eso no es lo que está pasando.

La tabla y el índice eran creados en el momento, y lo sorprendente es que solo eran 90.000 filas y la tabla tenía 12 campos, la mayoría VARCHAR2(10) y NUMBER. Por tanto, debería tener espacio suficiente para crear la tabla y el índice, de sobre, porque realmente eran unos 12M de tabla y unos 2M de índices. Entonces ¿Donde tenía el espacio ocupado que no estaba usando? Pues el error está en mirar ó confiar en la DBA_FREE_SPACE. La verdad es que se decidió no usar la papelera por tanto el parámetro RECYCLEBIN se colocó en OFF, pero en ese momento la persona encargada de la migración no vació la papelera antes ó después de desactivarla, y pasa que cuando está en OFF ó en ON la vista DBA_FREE_SPACE cuenta como libre ese espacio de segmentos borrados no “purgados”, pero Oracle no lo libera si lo necesita si está en OFF el parámetro. Así bien, cuando está en ON el mismo elimina el segmento de la papelera pero si está en OFF, no lo hace. Entonces compruebas que tienes segmentos en la papelera y ves que tienes, entonces primero antes de ampliar en borrar.
Es una tontería, porque piensas en segmentos temporales, tamaños, espacio libre y te haces mil preguntas, pero al final se puede probar, que con un INSERT en una tabla, que te dice que no puede extenderse un ORA-01653 y es que realmente no libera el espacio que te reporta como libre. Pero la verdad es que es bastante curioso (por lo menos para mi) ver como por un lado Oracle te dice que tienes espacio “libre”, pero la consulta no revisa que ese segmento no puede ser automáticamente borrado, y que la única forma de liberar este espacio, eres tu manualmente con el comando PURGE ó teniendo el parámetro RECYCLEBIN en ON. Que con puedes estar desperdiciando espacio.
Esto pasa en ocasiones cuando realizas migraciones a la versión 10g, y el cliente tiempo después, decide desactivar la papelera, y algunos desactivan la papelera en el acto, pero no se toman la molestia de limpiar la papelera.
Te recomiendo que eches un vistazo a tu papelera por si estas usan espacio que al final Oracle nunca va poder reutilizar:
select count(8)
from dba_recyclebin;
show parameter recyclebin

Con estas dos pequeñas consultas revisas esto. Es algo tonto este post, pero al final resolver los problemas es lo fácil, lo dificil es saber y comprender lo que está haciendo Oracle, porque en ocasiones miente o no te dice toda la verdad.
Si alguien quiere las pruebas del delito que me escriba un correo y se lo envío con mucho gusto, La verdad no se como subir un fichero en este blog , jejejeje :).

1 comentario:

  1. Muy buen blog, la verdad. No sabía que existía ese problema. ¿Dejó algún error en el fichero de alertas?.

    Una sugerencia, en este caso está claro de que se trato de que se trata de una 10g por la existencia de la papelera de reciclaje (y lo dices al ppo.) pero intenta poner siempre la versión de Oracle x.x.x.x y la de S.O. Por lo demás, estupendo ;).

    Otra sugerencia, "mójate" en más temas, el CBO, HA de RAC, DataGuard, Streams por ejemplo, interpretación de ficheros de traza, monitorización y temas de internals, sin olvidar los bugs que es otro mundo que pocas veces se suele tratar.

    ResponderEliminar