lunes 28 de diciembre de 2009

¿ 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 recupedo el bendito undotbs.

Espero que les sirva...