Cómo recrear un tablespace con datos

Posted by Paola Pullas | Posted in Base de Datos, Oracle, Refundation, Tips | Posted on 20-05-2008

4

En algunas oportunidades nos podemos encontrar con la necesidad de recrear un talespace que ya contiene datos, como por ejemplo cuando queremos cambiar una opción del tablespace que la sentencia “alter tablespace” no nos permite modificar. En estos casos podemos seguir los siguientes pasos para re-crear el tablespace sin perder los datos que contiene el mismo, de una forma sencilla:

1.- Primero confirmamos el espacio ocupado por el tablespace actualmente:

sql>select sum(bytes)/1024/1024 MB from user_segments where tablespace_name = ‘tbsname';

2.- Exportar los datos existentes en el tablespace que se desea recrear:

# exp system/psswd tablespaces=tbsname compress=n direct=y file=nombre.dmp log=nombre.log;

3.- Borrar el tablespace, desde el Enterprise Manager o via comandos:

sql> drop tablesapce tbsname including contents and datafiles;

4.- Recrear el tablespace. En este caso, por ejemplo, se quería cambiar la clausula de “segment space management” de manual a auto. De igual forma se puede re-crear el TBS vía EM o por linea de comandos:

sql> create tablespace tbsname datafile ‘/…./…dbf’ size 10M autoextend on next 1024K maxsize 50M logging extent management local segment space management auto;

5.- Importar el tablespace:

# imp system/psswd full=y file=nombre.dmp log=nombre.log tablespaces=tbsname rows=y indexes=y constraints=y commit=y ignore=y grants=n buffer=500000

Y con eso ya tendríamos los datos.

6.- Finalmente deberíamos comprobar que existe la misma cantidad de información el TBS luego de realizar el import:

sql>select sum(bytes)/1024/1024 MB from user_segments where tablespace_name = ‘tbsname';

Realizado por: Ing. Paola Izquierdo

Be Sociable, Share!

Comments (4)

hola, yo prefiero usar otra tècnica y es reconstruir los objetos. ya que me parece que la tecnica mencionada implica bajar el servicio a los usuarios si se tiene informacion vital del negocio sobre dichos tablespaces.

primero se crea el nuevo tablespace, o mas bien, el tablespace temporal. create tablespace data_tmp datafile ‘/oracle/oradata/data_tmp.dbf’ size xxxM;

luego busco los objetos de dicho tablespace, algo asi:

SELECT ‘ALTER INDEX ‘ || owner || ‘.’ || segment_name || ‘REBUILD TABLESPACE DATA_TMP;’
FROM dba_segments
WHERE tablespace_name =” AND segment_name IN (SELECT index_name FROM dba_indexes);

SELECT ‘ALTER INDEX ‘ || owner || ‘.’ || segment_name || ‘REBUILD TABLESPACE DATA_TMP;’
FROM dba_segments
WHERE tablespace_name =” AND segment_name IN (SELECT index_name FROM dba_indexes);

para otro tipo de objetos como paquetes o stored procedures me apoyo en sqldeveloper.

Luego de mover los objetos se valida que no queden objetos y se realiza la operacion que se desee.

y se repite el mismo proceso de vuelta. la opcion de alter table tiene una opcion ONLINE que no he explorado. si alguien la conoce me agradaria conocer si funciona en todas las versiones o solo en entreprise.

espero les sea util el comentario y me regalan sus criticas.

correcion: (no era rebuild sino move para las tablas)
SELECT ‘ALTER TABLE’ || owner || ‘.’ || segment_name || ‘ MOVE TABLESPACE DATA_TMP;’
FROM dba_segments
WHERE tablespace_name =” AND segment_name IN (SELECT table_name FROM dba_tables);

La ultima alternativa con el ALTER TABLE MOVE, es buena pero tiene algunas deficiencias, como son, que existe bloque a nivel de tabla, lo que hace que al momento de bloquera la tabla esta no pueda esta siendo usada por alguien ademas de que los indices se invalidan. la mejor alternativa es el redeftable que aunque es un proceso no tan simple, permite la reconstruccion en linea, si hay chain estos quedan eliminados, se recrean indices y extadisticas de tablas y el bloqueo de usuarios es por un instante muy pequeño

Write a comment