Un problema muy común y que a mi me ha pasado varias veces es que los tablespaces empiezan a crecer y crecer, y llega un momento que nos quedamos sin espacio en disco. Para resolver esto, sólo existe una solución que yo conozca por ahora para reducir de tamaño tablespaces. Oracle no dispone de un desfragmentador de tablespaces que agrupe todos los datos al comienzo del mismo, y podamos reducir su tamaño. La solución que nos deja es la siguiente.
La solución que propongo consiste en tres sencillos pasos:
- Crear un nuevo tablespace más pequeño.
- Copiar el esquema de datos en este nuevo tablespace.
- Borrar el originario.
Este proceso se puede utilizar también para el tablespace TEMP (es uno de los tablespaces indispensables para que funcione la base de datos).
El ejemplo que voy a seguir es para el tablespace TEMP. Para realizar estos pasos hay que realizar las siguientes tareas:
- Crear el nuevo tablespace temporal de la base de datos, al que llamaremos TEMP2.
- CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE SIZE 512M AUTOEXTEND ON NEXT 64M MAXSIZE 4096M;
- Obsérvese como en la creación de este tablespace se asigna un valor MAXISZE. Configurar TEMP2 como tablespace temporal por defecto de la base de datos.
- ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;
- Poner en estado OFFLINE el antiguo tablespace temporal. En este punto se observa que no se puede hacer:
- ALTER TABLESPACE TEMP OFFLINE;
- La bd devuelve el error ORA-03217. Este error indica que los datafiles asociados a este tablespace están ONLINE. Para solucionarlo, hay que poner los datafiles del tablespace en OFFLINE. Para hacer esto hacemos:
- ALTER DATABASE TEMPFILE ‘+disco/BD/tempfile/datafile’ OFFLINE;
- Borrar el antiguo tablespace temporal.
- DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;
- Volvemos a intentar asignar el nuevo tablespace TEMP2 como tablespace por defecto de la base de datos.
- ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;
- Comprobaremos ahora como los esquemas existentes en la base de datos tienen como tablespace temporal por defecto TEMP2 con la siguiente consulta:
- select username,temporary_tablespace from dba_users;
Eso es todo.
Excelente artículo, Que pasos previos se deben llevar a cabo: Detener la base de datos, entre otros.
Hola Miguel. Si claro. Además, ten en cuenta que este artículo lo hice hace muchos años, seguramente cuando usaba Oracle 9i o Oracle 10g. Ahora ha evolucionado y puede que haya algún método alternativo. Desde entonces no he vuelto a trabajar con Oracle como SYSDBA así que no te puedo decir. Un saludo y gracias por pasarte.