¿ Como recuperar el UNDOTBS de oracle ?

Pues eso amig@s, ya ha pasado antes, pero les dejo varias soluciones para recuperar el tablespace de UNDO en oracle 10g (puede que en la 11g) tambien.

SOLUCION 1:

1-Buscamos la copia del init.ora que tengamos, si no lo tenemos podemos crearlo de la siguiente manera:

1.1 Nos conectamos al SQLPLUS:

C:\> sqlplus /nolog
SQL> conn sys/sys as sysdba
SQL> startup nomount;
SQL> create pfile='c:\init.ora' from spfile;
SQL> exit

(nota: si el fichero esta corrupto, es decir el UNNDOTBS.DBF lo eliminamos).

1.2 Con esto hemos creado una copia del archivo de arranque de nuestra base de datos, nos vamos a la unidad C:\ y editamos el fichero init.ora y agregamos la siguiente linea:

rollbacksegment=(SYSTEM)

1.3 Guardamos el fichero y ahova volvemos a ejecutar el SQLPLUS:

C:\> sqlplus /nolog
SQL> conn sys/sys as sysdba
SQL> startup mount pfile='c:\init.ora';
SQL> recover database using backup controlfile until cancel;

1.4 Una vez que la base de datos este abierta, vamos a recrear el UNDOTBS con el siguiente comando:

CREATE UNDO TABLESPACE UNDOTBS01 DATAFILE 'C:\oracle\product\10.2.0\oradata\orcl\UNDOTBS01.DBF' SIZE 2M REUSE AUTOEXTEND ON;

1.5 Una vez que hemos creado el undo tablespace, editamos el init.ora y eliminamos la linea rollbacksegment=(SYSTEM) del init.ora.

1.6 Ahora debemos hacer los cambios permanentes para ello, ejecutamos la siguiente sentencia:

C:\> sqlplus /nolog
SQL> conn sys/sys as sysdba
SQL> create spfile from pfile='c:\init.ora';
SQL> shutdown immediate;
SQL> conn sys/sys as sysdba
SQL> startup;

SOLUCION 2:

Primero nos conectamos con sys y arrancamos la bbdd con el init.ora, asi:

C:\> sqlplus /nolog
SQL> conn sys/sys as sysdba
SQL> startup mount pfile='c:\init.ora';

Comprobamos que datafile es:

SQL> select file#, status from v$datafile;
FILE# STATUS
---------- -------
1 SYSTEM
2 RECOVERY
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
8 ONLINE
9 ONLINE
10 ONLINE
11 ONLINE

Como podemos ver nuestro undo es el nº 2 asi que lo vamos a poner offline:

SQL> alter database datafile 2 offline;
SQL> select file#, status from v$datafile;
FILE# STATUS
---------- -------
1 SYSTEM
2 OFFLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
8 ONLINE
9 ONLINE
10 ONLINE
11 ONLINE

Ahora paramos la base de datos y editamos el fichero init.ora:

SQL> shutdown immediate;
SQL> exit;

Editamos el init.ora y buscamos las siguientes lineas:

*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS_01'

Y la cambiamos a:

*.undo_management='MANUAL'
#*.undo_tablespace='UNDOTBS_01'

Volvemos a arrancar la bbdd y ya se abrira por arte de magia:

C:\> sqlplus /nolog
SQL> conn sys/sys as sysdba
SQL> startup pfile='c:\init.ora';

Ahora debemos crear otro tablespace de undo con el siguiente comando:

SQL> CREATE UNDO TABLESPACE undotbs_02 DATAFILE 'C:\oracle\product\10.2.0\oradata\orcl\UNDOTBS02.DBF' SIZE 2M AUTOEXTEND ON;

SQL> select file#, name, status from v$datafile;

C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS02.DBF

FILE#
----------
NAME
-------------------------------------------------------------------------

STATUS
-------
ONLINE

Ya tenemos nuestro UNDOTBS recuperado....

Por ultimo debemos modificar el init.ora, y cambiar las lineas que hemos modificado antes:

*.undo_management='MANUAL'
#*.undo_tablespace='UNDOTBS_01'

Lo cambiamos a:

*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS_02'

Hacemos un shutdown immediate y luego un startup:

SQL> shutdown immediate;
SQL> startup pfile='c:\init.ora';

Con estos pasos ya hemos recuperado el bendito undotbs.

Actualizacion 12/05/2012: Adicional a esto, si al intentar eliminar el antiguo tablespace undotbs corrupto nos da un error diciendo:

ORA-01548: active rollback segment '_SYSSMU1$' found, terminate dropping tablespace

Donde _SYSSMU puede ser otro nº tambien, debemos mediante la siguiente consulta saber los segmentos de rollback que necesitan ser deshabilitados para luego poder eliminar el tablespace corrupto. Cuando digo deshabilitado no quiere decir que vamos a perder una funcionalidad, sino que directamente le decimos a la bbdd que no utilice esos segmentos.

Para identificarlos, con la siguiente query obtendremos una lista de los rollbacks que necesitan ser recuperados (NEED RECOVERY):

select SEGMENT_NAME,STATUS,TABLESPACE_NAME from dba_rollback_segs;

SEGMENT_NAME STATUS


----------------
_SYSSMU1$ NEEDS RECOVERY

Con todos los resultados, debemos anotar el segment_name, que en este caso aparece uno solo y es el _SYSSMU1$ y añadir una linea en el init.ora que hemos creado con la siguiente informacion:

_offline_rollback_segments=(_SYSSMU1$,.......)  y asi por cada segment_name que nos aparezca. Grabamos el init.ora e iniciamos la bbdd con el init startup pfile='c:\init.ora' y luego procedemos a eliminar el tablespace:

SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS;

y... Voila! ya podemos eliminar el tablespace corrupto.
Espero que les sirva...
Share on Google Plus
    Blogger Comment

0 comentarios: