sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo reducir el espacio de tabla temporal en Oracle?

¡Oh Dios mío! ¡Observe el tamaño de mi espacio de tabla temporal! O... cómo reducir los espacios de tabla temporales en Oracle.

Sí, ejecuté una consulta para ver qué tan grande es mi tablespace temporal:

SQL> SELECT tablespace_name, file_name, bytes
2  FROM dba_temp_files WHERE tablespace_name like 'TEMP%';

TABLESPACE_NAME   FILE_NAME                                 BYTES
----------------- -------------------------------- --------------
TEMP              /the/full/path/to/temp01.dbf     13,917,200,000

La primera pregunta que debe hacerse es por qué el tablespace temporal es tan grande. Es posible que sepa la respuesta a esto de la cabeza. Puede deberse a una consulta grande que acaba de ejecutar con un tipo que fue un error (lo he hecho más de una vez). Puede deberse a alguna otra circunstancia excepcional. Si ese es el caso, entonces todo lo que necesita hacer para limpiar es reducir el espacio temporal de la mesa y seguir adelante con su vida.

Pero, ¿y si no lo sabes? Antes de que decida reducir, es posible que deba investigar un poco las causas del gran espacio de tablas. Si esto sucede regularmente, es posible que su base de datos solo necesite ese espacio.

La vista de rendimiento dinámico

V$TEMPSEG_USAGE

puede ser muy útil para determinar la causa.

Tal vez simplemente no le importa la causa y solo necesita reducirla. Este es su tercer día en el trabajo. Los datos en la base de datos son solo datos de 200 MiBif y el espacio de tabla temporal es de 13 GiB:solo redúzcalo y continúe. Si vuelve a crecer, investigaremos la causa. Mientras tanto, no tengo espacio en ese volumen de disco y solo necesito recuperar el espacio.

Echemos un vistazo a reducirlo. Dependerá un poco de la versión de Oracle que esté ejecutando y de cómo se configuró el espacio de tabla temporal.
Oracle hará todo lo posible para evitar que cometa errores horrendos, así que probaremos los comandos y si no es así trabajaremos de una forma nueva.

Primero intentemos reducir el tamaño del archivo de datos. Si podemos hacer eso, recuperaremos el espacio y podremos preocuparnos de por qué creció mañana.

SQL>
SQL> alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M; 
alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M
*   
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value

Según el mensaje de error, es posible que desee probar esto con diferentes tamaños que son más pequeños que el sitio actual del archivo. He tenido un éxito limitado con esto. Oracle solo reducirá el tamaño del archivo si el espacio de tabla temporal está al principio del archivo y si es más pequeño que el tamaño que usted especifique. Alguna documentación antigua de Oracle (corregieron esto) decía que podía ejecutar el comando y el mensaje de error le indicaría a qué tamaño podría reducirse. Cuando comencé a trabajar como DBA esto no era cierto. Solo tenía que adivinar y volver a ejecutar el comando varias veces y ver si funcionaba.

Bien. Eso no funcionó. ¿Qué tal esto?

SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;

Si estás en 11 g (quizás también en 10 g), ¡aquí está! Si funciona, es posible que desee volver al comando anterior e intentarlo más.

Pero qué pasa si eso falla. Si el tablespace temporal es el temporal predeterminado que se configuró cuando se instaló la base de datos, es posible que deba trabajar mucho más. En este punto, suelo volver a evaluar si realmente necesito recuperar ese espacio. Después de todo, el espacio en disco solo cuesta $X.XX por GiB. Por lo general, no quiero hacer cambios como este durante las horas de producción. ¡Eso significa trabajar en 2AMAGAIN! (No es que realmente me oponga a trabajar a las 2 a.m., es solo que... Bueno, también me gusta dormir. Y a mi esposa le gusta tenerme en casa a las 2 a.m.... no vagando por las calles del centro a las 4 a.m. tratando de recordar dónde estacioné mi coche 3 horas antes. He oído hablar de eso del "teletrabajo". Solo me preocupa que llegue a la mitad y luego mi conexión a Internet falle; la base de datos.)

Bien... Volvamos a las cosas serias... Si el espacio de tabla temporal que desea reducir es su espacio de tabla temporal predeterminado, primero tendrá que crear un nuevo espacio de tabla temporal, configurarlo como el espacio de tabla temporal predeterminado, luego eliminar su antiguo espacio de tabla temporal predeterminado y volver a crear eso. Afterwordsdrop la segunda tabla temporal creada.

SQL> CREATE TEMPORARY TABLESPACE temp2
2  TEMPFILE '/the/full/path/to/temp2_01.dbf' SIZE 5M REUSE
3  AUTOEXTEND ON NEXT 1M MAXSIZE unlimited
4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Tablespace created.

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;

Database altered.

SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;

Tablespace dropped.


SQL> CREATE TEMPORARY TABLESPACE temp
2  TEMPFILE '/the/full/path/to/temp01.dbf' SIZE 256M REUSE
3  AUTOEXTEND ON NEXT 128M MAXSIZE unlimited
4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Tablespace created.

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;

Database altered.

SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;

Tablespace dropped.

¡Esperemos que una de estas cosas ayude!