¿spfile o init.ora?

A partir de la versión 9, Oracle introdujo el fichero de parámetros de arranque (más conocido como ‘spfile’) como mejora a los antiguos aranques con los ‘init.ora’.

Las ventajas que tienen estos nuevos ficheros sobre los antiguos son, entre otras:

·Los ‘spfile’ son binarios, mientras que los ‘init.ora’ eran ficheros de texto.

·Con los ‘spfile’ se puede arrancar una instancia en modo remoto, mientras que con los ‘init.ora’ el fichero debe estar accesible (residir en el mismo sistema de ficheros) desde el que se realiza el aranque.

·Los ‘ALTER SYSTEM’ son guardados (si se quiere) automáticamente en los ‘spfile’, mientras que en los ‘init.ora’ no.

·Los ‘spfile’ pueden ser incluidos en los ‘backups’ de RMAN, mientras que los ‘init.ora’ no.

No obstante, y debido a que los ‘init.ora’ pueden ser aun de gran utilidad (arrancar una instancia cuando hay problemas, sobre todo), Oracle los ha ha mantenido (aunque recomienda encarecidamente el uso de los ‘spfile’).

Aun así, hay DBA’s que siguen fieles a sus ‘init.ora’ y sigue siendo su método favorito de arrancar las instancias.

Pero esto puede hacer que ocurran cosas como:

carlos@db01.server1> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
PL/SQL Release 9.2.0.8.0 - Production
CORE    9.2.0.8.0       Production
TNS for Linux: Version 9.2.0.8.0 - Production
NLSRTL Version 9.2.0.8.0 - Production

carlos@db01.server1> show parameter job

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes                  integer     0

carlos@db01.server1> alter system set job_queue_processes=16 scope=both;
alter system set job_queue_processes=16 scope=both
*
ERROR en línea 1:
ORA-32001: write to SPFILE requested but no SPFILE specified at startup

¡Ooops! Aquí vemos -por las malas- que la instancia ha sido arrancada con un ‘init.ora’.
Pero ¿Cómo podemos saber si una instancia ha sido arrancada con un ‘spfile’ o un ‘init.ora’?
La respuesta está en la vista dinámica V$SPPARAMETER, que nos indica qué parametros fueron especificados utilizando un ‘spfile’.

De modo que la siguiente ‘SELECT’ nos dirá si la instancia arrancó con ‘spfile’ o con ‘init.ora’:

carlos@db01.server1> SELECT DECODE( hay ,
  2                 0, 'init.ora',
  3                 'spfile.ora') "Arranque"
  4    FROM ( SELECT count(*) hay
  5             FROM V$SPPARAMETER
  6            WHERE ISSPECIFIED = 'TRUE');

Arranque
----------
init.ora

Mientras que en una instancia arrancada con ‘spfile’:

carlos@db01.server2> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

carlos@db01.server2> SELECT DECODE( hay ,
  2                 0, 'init.ora',
  3                 'spfile.ora') "Arranque"
  4    FROM ( SELECT count(*) hay
  5             FROM V$SPPARAMETER
  6            WHERE ISSPECIFIED = 'TRUE');

Arranque
----------
spfile.ora

Saludos.

Carlos.

5 respuestas a ¿spfile o init.ora?

  1. Óscar de la Torre dice:

    Yo me decanto por un simple:

    show parameter spfile

    Aunque no hay día que no descubra una v$ nueva🙂

  2. carlosal dice:

    Hola Óscar.

    Lo malo de tu método es que con eso ves si la instancia TIENE un ‘spfile’, pero no SI SE HA ARRANCADO CON un ‘spfile’ o no. Esto es: la instancia normalmente arranca con ‘spfile’, pero hoy el DBA (que es un cachondo) usó un ‘init.ora’ que tenía por ahí…

    Saludos.

    Carlos.

  3. Óscar de la Torre dice:

    La prueba es con un Windows XP + 9.2.0.7
    La configuración que tengo es un init en el directorio %ORACLE_HOME%\database que apunta a su vez
    al spfile:

    spfile=’D:\oracle\admin\test9i\pfile\SPFILETEST9I.ORA’

    ops$oskar@test9i$ shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    ops$oskar@test9i$ startup
    ORACLE instance started.

    Total System Global Area 269557604 bytes
    Fixed Size 454500 bytes
    Variable Size 209715200 bytes
    Database Buffers 58720256 bytes
    Redo Buffers 667648 bytes
    Database mounted.
    Database opened.
    ops$oskar@test9i$ show parameter ifile

    NAME TYPE VALUE
    ———————————— ———– ——————————
    ifile file
    ops$oskar@test9i$ show parameter spfile

    NAME TYPE VALUE
    ———————————— ———– ——————————
    spfile string D:\oracle\admin\test9i\pfile\S
    PFILETEST9I.ORA
    ops$oskar@test9i$ shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.

    Ahora utilizo explícitamente un init:

    ops$oskar@test9i$ startup pfile=D:\oracle\admin\test9i\pfile\inittest9i.ora
    ORACLE instance started.

    Total System Global Area 269557604 bytes
    Fixed Size 454500 bytes
    Variable Size 209715200 bytes
    Database Buffers 58720256 bytes
    Redo Buffers 667648 bytes
    Database mounted.
    Database opened.
    ops$oskar@test9i$ show parameter ifile

    NAME TYPE VALUE
    ———————————— ———– ——————————
    ifile file
    ops$oskar@test9i$ show parameter spfile

    NAME TYPE VALUE
    ———————————— ———– ——————————
    spfile string
    ops$oskar@test9i$ shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.

    Por último, modifico mi init del directorio %ORACLE_HOME%\database para que apunte al init:

    ops$oskar@test9i$ startup
    ORACLE instance started.

    Total System Global Area 269557604 bytes
    Fixed Size 454500 bytes
    Variable Size 209715200 bytes
    Database Buffers 58720256 bytes
    Redo Buffers 667648 bytes
    Database mounted.
    Database opened.
    ops$oskar@test9i$ show parameter ifile

    NAME TYPE VALUE
    ———————————— ———– ——————————
    ifile file D:\oracle\admin\test9i\pfile\i
    nittest9i.ora
    ops$oskar@test9i$ show parameter spfile

    NAME TYPE VALUE
    ———————————— ———– ——————————
    spfile string

    En principio respeta la premisa de indicar con qué se ha arrancado. ¿En qué circunstancias has encontrado que no se cumpla?

  4. carlosal dice:

    Óscar:

    OK.

    Se me ocurre un ejemplo (rebuscado) aunque no tengo a mano ninguna base de datos para ‘jugar’:

    Si tu arrancas con un init.ora que incluye un spfile=’bla\bla\bla’ el ‘show parameter’ mostrará dicho spfile, pero si debajo de ese spfile=’bla\bla\bla’ pones nuevos valores a los parámetros del spfile en cuestión, el ‘show parameter spfile’ dará un ‘spfile’ que en realidad no ha fijado ninguno de los parámetros de la instancia.

    Por supuesto, en el 99,9% de los casos show parameter nos da la solución, pero yo quería mostrar el uso de V$SPPARAMETER.

    Saludos.

    Carlos.

  5. jorgex dice:

    gracias fue una excelente solucion

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: