Hoy vamos a ver algo tan sencillo como el recuperar un fichero spfile.
El spfile es la «nueva» version del fichero de configuracion de parametros texto de toda la vida llamado pfile. La principal ventaja que obtenemos con tener un fichero de configuración binario sobre un fichero de texto es que la instancia puede ir actualizando los cambios de configuración que llevas a cabo en la base de datos sin necesidad de tener que actualizarlo manualmente. Hemos de tener en cuenta que, con los nuevos modos de gestión de memoria la configuracion del tamaño de los distintos pooles ya no es estático, con lo que es necesario tener un fichero de datos actualizable si quieres mantener esa informacion en el siguiente arranque.
El fichero spfile es necesario en el momento en el que arrancas la instancia, pero no lo es para el funcionamiento de la base de datos, si borras este fichero cuando la base de datos esta en funcionamiento todo funcionará correctamente, solamente tendremos errores cuando intentemos modificar algo del spfile, y los errorres que tendremos serán errores de localizacionde fichero del sistema operativo
ORA-01565: error al identificar el archivo '/opt/oracle/product/11.2.0.3/dbhome_1/dbs/spfileorcl.ora' ORA-27037: no se ha podido obtener el estado del archivo Linux-x86_64 Error: 2: No such file or directory Additional information: 3
Pero la base de datos seguirá funcionando correctamente.
Para restaurar un spfile tenemos dos opciones:
1- Restauración desde RMAN
Rman hace una copia del controlfile y el spfile cada vez que llevas a cabo un backup del tablespace system. Así pues, si hacemos backups full de nuestra base de datos, deberíamos de tener una copia del spfile en el backupset.
La recuperación del fichero es muy sencilla, simplemente hay que decirle que lo restaure del autobackup con el comando:
restore spfile from autobackup;
Si tenemos la base de datos en funcionamiento el comando fallará devolviendonos el error:
RMAN> restore spfile from autobackup; Starting restore at 29/09/12 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=156 device type=DISK RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of restore command at 09/29/2012 21:58:30 RMAN-06564: must use the TO clause when the instance is started with SPFILE
la solución a este problema es muy sencilla, vamos a engañar un poco a nuestra base de datos, vamos a recuperarlo a un lugar alternativo y luego lo moveremos con comandos del sistema operativo (o del asm).
RMAN> restore spfile to '?/dbs/spfile.backup' from autobackup; Starting restore at 29/09/12 using channel ORA_DISK_1 recovery area destination: /opt/oracle/flash_recovery_area database name (or database unique name) used for search: ORCL channel ORA_DISK_1: restoring spfile from AUTOBACKUP /opt/oracle/flash_recovery_area/ORCL/autobackup/2012_09_29/o1_mf_s_795264706_86ffo3j0_.bkp channel ORA_DISK_1: SPFILE restore from AUTOBACKUP complete Finished restore at 29/09/12 RMAN> quit $cd /opt/oracle/product/11.2.0.3/dbhome_1/dbs/ mv spfile.backup spfileorcl.ora
P.D en caso de que la instancia estuviese caída y no tuviesemos el spfile en el momento la base de datos deberá de estar en modo MOUNT
2-Creándolo a partir del alert.log
Cada vez que arrancamos y paramos la base de datos, toda la información del spfile es volcada en el fichero alert.log
Starting up: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production processes = 150 memory_target = 1536M control_files = "/opt/oracle/oradata/orcl/control01.ctl" control_files = "/opt/oracle/flash_recovery_area/orcl/control02.ctl" db_block_size = 8192 compatible = "11.2.0.0.0" db_recovery_file_dest = "/opt/oracle/flash_recovery_area" db_recovery_file_dest_size= 3882M undo_tablespace = "UNDOTBS1" remote_login_passwordfile= "EXCLUSIVE" db_domain = "" dispatchers = "(PROTOCOL=TCP) (SERVICE=orclXDB)" local_listener = "LISTENER_ORCL" audit_file_dest = "/opt/oracle/admin/orcl/adump" audit_trail = "DB" db_name = "orcl" open_cursors = 300 diagnostic_dest = "/opt/oracle" . . .
Asimismo, tambien deja reflejados los cambios que hacemos si ejecutamos
SQL> alter system set undo_retention=9000;
Y luego miramos el alert, vemos que
ALTER SYSTEM SET undo_retention=9001 SCOPE=BOTH;
Con lo que, podremos regenerar nuestro spfile creando un fichero de texto con estos valores (fichero parameter file de texto clásico) , y despues ejecutando el comando.
create spfile from pfile='/tmp/init_SID.ora'
P.D si la isntancia está levantada, aqui tendremos el mismo problema que cuando intentamos recuperar de RMAn con autobackup, con lo que tendremos que aplicar la misma solución, engañar a oracle desde el sistema operativo
create spfile='?/dbs/spfile.backup' from pfile='/tmp/initSID.ora' cd $ORACLE_PRODUCT/dbs mv spfile.backup spfileorcl.ora