En muchas ocasiones tenemos que ampliar el Tablespace temporal (nombrado habitualmente como TEMP) de nuestra Base de Datos Oracle por alguna razón como, Query muy pesada que requiere ordenación, creación de índices nuevos de tablas enormes, el Tablespace temporal lo creamos con AUTOEXTEN a ON y se hizo enorme, etc., el caso es que nos podemos encontrar con un Tablespace demasiado grande y todo ese espacio que hemos añadido de forma puntual nos gustaría recuperarlo. No pueden surgir las siguientes preguntas ¿Como podemos reducirlo para liberar espacio? ¿Podemos hacer la operación con la Base de Datos arriba?
En Oracle no hay posibilidad de reducir el tamaño del Tablespace temporal por lo que tenemos que realizar un truco alternativo.
Con el siguiente procedimiento siguiente podemos reconstruir nuestro Tablespace Temporal o TEMP al espacio que realmente queremos tener y sin necesidad de tirar nuestra base de datos Oracle, es decir, no vamos a producir perdida de servicio.
Lo primero que necesitamos es un poco de espacio en algún filesystem para crear un segundo Tablespace Temporal, a este tablespace comodin le llamaremos por ejemplo TEMP_SECUNDARIO, con unos 20 o 30 MB será suficiente.
Una vez que tengamos la ubicación de nuestro espacio creamos este segundo Tablespace temporal.
CREATE TEMPORARY TABLESPACE TEMP_SECUNDARIO TEMPFILE '/oracle/oradata/PRUEBA01/tmp/PRUEBA01_tmp02.dbf' size 20M;
Bien, ahora vamos hacer que sea el Tablespace Temporal por defecto de nuestra Base de Datos.
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP_SECUNDARIO;
Como nuestra Base de Datos ya tiene un Tablespace temporal nuevo vamos a borrar el original.
Primero ponemos en OFFLINE el Datafile del Tablespace TEMP (original).
ALTER DATABASE TEMPFILE '/oracle/oradata/PRUEBA01/tmp/PRUEBA01_tmp01.dbf' OFFLINE;
Y ahora lo borramos.
DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;
Comprobar que el Datafile sea borrado sino borrarlo, en algunas ocasiones puede que no sea borrado por Oracle.
Si todo ha ido bien tenemos un nuevo Tablespace Temporal y hemos borrado el original, ahora vamos a crear el Tablespace Temporal original con el tamaño adecuado y haremos que sea el Tablespace Temporal por defecto, básicamente vamos a realizar la misma operación que anteriormente pero de forma inversa.
Creamos nuestro Tablespace Temporal (TEMP) con el espacio adecuado, en este caso 300M, utilizaremos la nomenclatura original tanto para el Tablespace como para el Datafile.
CREATE TEMPORARY TABLESPACE TEMP TEMPFILE '/oracle/oradata/PRUEBA01/tmp/PRUEBA01_tmp01.dbf' size 300M;
seguidamente lo convertimos en el Tablespace Temporal por defecto.
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;
Ahora solo nos queda eliminar el Tablespace TEMP_SECUNDARIO y ya tenemos nuestro tablespace temporal con el tamaño que nos interesaba.
ALTER DATABASE TEMPFILE '/oracle/oradata/PRUEBA01/tmp/PRUEBA01_tmp02.dbf' OFFLINE;
DROP TABLESPACE TEMP_SECUNDARIO INCLUDING CONTENTS AND DATAFILES;