Pfile vs Spfile

En este post, quiero mostrar la diferencia entre tener una base de datos con Pfile contra una que tiene Spfile.

Para iniciar, definamos lo que es cada uno de los términos. Ambos se refieren a un archivo, este archivo, es el que define el comportamiento de la base de datos por medio de parámetros de la misma.

Pfile

El nombre viene de Parameter File y es un archivo de texto y vive en el sistema de archivos, específicamente en el:

ORACLE_HOME\database     (windows)
ORACLE_HOME/dbs          (linux o unix)

Este archivo cuyo formato es initSID.ora, es leído cuando se levanta la instancia de la base de datos y con base en él, se conforma el comportamiento de la misma. Los parámetros de la base de datos pueden ser modificados en dicho archivo y serán tomados en cuenta la siguiente vez que se levante la base de datos. Para modificarlo, basta con que se use un editor común de texto.

Spfile

El nombre proviene de Server Parameter File, y es un archivo binario asociado a la base de datos. La enorme diferencia, estriba en que al estar levantada la base, se pueden modificar varios parámetros de la misma dinámicamente sin tener que darla de baja.

Esto sin embargo, aunque funciona para la mayoría de parámetros, no lo hace para todos, pero con poder modificar esa mayoría, basta para poder realizar ajustes a la base de datos sin problema.

¿Cómo interactuar entre ambos tipos?

Después, conectándonos como Sysdba, para saber antes si tenemos nuestra base de datos como Spfile, o no, tenemos que mostrar el valor de dicho parámetro con show parameter como se indica en el ejemplo siguiente:

SQL> show parameter spfile
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string
SQL>

Si el valor está vacío, implica que nuestra base de datos está con Pfile. Si se observa un valor, significa lo contrario, con lo cual, tendremos nuestra base de datos como Spfile.

Para hacer que nuestra base de datos que está como Pfile, se base ahora en un Spfile, se tiene que usar el comando:

create spfile from pfile;

con el cual, se crea una copia binaria del Pfile para que la base de datos lo tome la siguiente vez que sea levantada como se puede ver en el siguiente ejemplo:

SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string

SQL> create spfile from pfile;

File created.

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

E:\oracle\product\10.2.0\BIN>cd ..\database

E:\oracle\product\10.2.0\database>dir *pfile*
 El volumen de la unidad E es MetalliOra
 El número de serie del volumen es: D0FD-FE0C

 Directorio de E:\oracle\product\10.2.0\database

18/03/2009  06:57 p.m.             2,560 SPFILELAB.ORA
               1 archivos          2,560 bytes
               0 dirs  19,240,804,352 bytes libres

E:\oracle\product\10.2.0\database>

Después de hacer esto, se reinicia la base de datos y nada más por la existencia del Spfile, ya se habrá dado de alta con los parámetros del mismo:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  666894336 bytes
Fixed Size                  1298472 bytes
Variable Size             448794584 bytes
Database Buffers          209715200 bytes
Redo Buffers                7086080 bytes
Database mounted.
Database opened.
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      E:\ORACLE\PRODUCT\10.2.0\DATAB
                                                 ASE\SPFILELAB.ORA

Si después de tener una base de datos basada en un Spfile, se desea regresar a un Pfile, se tienen que seguir los pasos enumerados a continuación:

  1. Verificar que se tiene un archivo initSID.ora
  2. Si no se tiene el archivo, entonces, crear uno con base en el spfile con el comando:    create pfile from spfile
  3. Arreglar los parametros en el archivo generado (initSID.ora).
  4. Borrar el spfile.
  5. Reiniciar la base de datos.

Ejemplo:

SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      E:\ORACLE\PRODUCT\10.2.0\DATAB
                                                 ASE\SPFILELAB.ORA
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

E:\oracle\product\10.2.0\BIN>cd ..\database

E:\oracle\product\10.2.0\database>dir init*
 El volumen de la unidad E es MetalliOra
 El número de serie del volumen es: D0FD-FE0C

 Directorio de E:\oracle\product\10.2.0\database 24/01/2009  03:11 p.m.               946 initlab.ora
               1 archivos            946 bytes
               0 dirs  19,240,779,776 bytes libres

E:\oracle\product\10.2.0\database>ren initlab.ora tempinitlab.ora

E:\oracle\product\10.2.0\database>dir init*
 El volumen de la unidad E es MetalliOra
 El número de serie del volumen es: D0FD-FE0C

 Directorio de E:\oracle\product\10.2.0\database

No se encuentra el archivo

E:\oracle\product\10.2.0\database>cd ..\bin

E:\oracle\product\10.2.0\BIN>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on MiÚ Mar 18 19:14:51 2009

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create pfile from spfile;

File created.

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

E:\oracle\product\10.2.0\BIN>cd ..\database

E:\oracle\product\10.2.0\database>dir init*
 El volumen de la unidad E es MetalliOra
 El número de serie del volumen es: D0FD-FE0C

 Directorio de E:\oracle\product\10.2.0\database 18/03/2009  07:14 p.m.               951 INITlab.ORA
               1 archivos            951 bytes
               0 dirs  19,240,775,680 bytes libres

E:\oracle\product\10.2.0\database>del spfilelab.ora

E:\oracle\product\10.2.0\database>cd ..\bin

E:\oracle\product\10.2.0\BIN>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on MiÚ Mar 18 19:18:27 2009

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      E:\ORACLE\PRODUCT\10.2.0\DATAB
                                                 ASE\SPFILELAB.ORA

SQL> startup force
ORACLE instance started.

Total System Global Area  666894336 bytes
Fixed Size                  1298472 bytes
Variable Size             448794584 bytes
Database Buffers          209715200 bytes
Redo Buffers                7086080 bytes
Database mounted.
Database opened.
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string

En este momento, ya la base de datos se encuentra basada en el Pfile.

¿Qué contiene un Pfile y un Spfile?

Básicamente, los parámetros en cuestión que modelarán la base de datos, en el caso del Spfile, tiene caracteres binarios entendibles para Oracle aunque ilegibles para nosotros, más los parámetros que se están definiendo. Los parámetros que no son incluidos en dichos archivos, toman su valor por default al momento de levantar la base de datos. Aquí incluyo un par de imágenes con la muestra de ambos archivos abiertos en el Notepad++.

Espero haya sido de utilidad el presente post y con base en él, sea más claro el cómo funciona un archivo de parámetros para la base de datos Oracle.

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

17 Responses to Pfile vs Spfile

  1. vl4dy says:

    gracias

  2. orlandoolguin says:

    De nada.

    Orlando.

  3. Ernesto Cruz says:

    Muchas gracias, me fue de mucha utilidad, aplique para que mi base iniciara con spfile y funciono tal cual como lo explicaste.

  4. orlandoolguin says:

    Hola Ernesto,

    Qué bueno que te ha sido de utilidad este post. Ojalá me sigas visitando.

    Orlando.

  5. Israel says:

    Que tal Orlando, buen dia, oye si necesito cambiar el parametro del audit_trail a una BD con pfile, es necesario declarar en la sentencia con scope=pfile, generalmente trabajo con spfile y utilizo este comando alter system set audit_trail=db_extended scope=spfile; pero ahora tengo la duda si con declarar scope=pfile tiene la misma funcionalidad, gracias y bastante buena tu explicación.

  6. orlandoolguin says:

    Hola Israel,

    Cuando quieres cambiar el valor de algún parámetro, tienes las opciones para scope como:

    memory – cuando quieres cambiar nada más en la instancia que tienes levantada.
    pfile – cuando quieres cambiar el valor sólo en spfile que define el comportamiento cuando levantes nuevamente la instancia.
    both – modifica el valor del parámetro en la instancia actual y en el spfile.

    Hay que recordar que algunos parámetros no pueden ser cambiados en memoria, tienes que cambiarlos en el pfile para después hacer un bounce (dar de baja y volver a levantar) a tu instancia.

    Espero te sirva esta información. Además, puedes visitar: https://orlandoolguin.wordpress.com/2008/10/28/auditando-la-base-de-datos/

    Orlando.

  7. Pingback: Creación de una base de datos en Windows « Orlando Olguín Olvera

  8. wfv says:

    Hola, me podrian ayudar con este error, gracias

    alter system set db_32k_cache_size = 100M;

    ORA-02097: no se puede modificar el parámetro porque el valor especificado no es válido
    ORA-00382: 32768 no es un tamaño de bloque válido, rango válido [..]

  9. orlandoolguin says:

    Hola,

    ¿De qué tamaño es tu db_block_size?
    ¿De qué tamaño es el bloque a nivel sistema operativo?

    Revisa la documentación oficial de Oracle: http://docs.oracle.com/cd/B28359_01/server.111/b28320/initparams043.htm

    Orlando.

  10. wfv says:

    Hola Orlando, gracias por responder
    el tamaño de mi db_block_size es de 8k
    *.db_block_size=8192

  11. orlandoolguin says:

    Hola WFV,

    Perdona por contestar hasta hoy, espero que aún te sirva.

    Según la nota que te incluí, está bien usar el db_32k_cache_size si el tamaño de bloque de tu base de datos está en 8k.

    Sin embargo de acuerdo a la misma nota, hay que verificar de qué tamaño es el bloque a nivel sistema operativo, porque si es digamos 16k, entonces el máximo db_nk_cache_size que puedes usar es de el de 16k.

    Orlando.

  12. lm says:

    Hola Orlando, aplique los pasos que indicas y efectivamente “funciono”. Los parámetros que modifique fueron:
    *.sga_max_size
    *.sga_target
    La base inicio con estos datos luego de activar nuevamente el pfile, y la aplicación también levanto, pero revertí el proceso pues los usuarios no podían ingresar a la aplicación “error page” y “error 500” al tratar de hacer login a la aplicación.

    ¿Que puede estar pasando?

    Gracias.

  13. orlandoolguin says:

    Hola lm,

    ¿Puedes incluir por favor una muestra del error completo? Así nada más no veo qué está pasando.

    ¿Hiciste una copia del spfile a un pfile antes de hacer dicho cambio para poder partir del mismo?

    Sugiero para iniciar, restablecer el pfile original para que puedas arrancar y de ahí, ver qué está pasando.

    Orlando.

  14. lm says:

    Hola orlando, disculpa no contestar antes. Pero por la premura de iniciar los servicios no capture imágenes del error pero podría enviarte los archivos spfile y pfile que genere para que veas cuales fueron los cambio. Si me indicas un correo te los envió lo mas pronto posible.

    Gracias.

  15. orlandoolguin says:

    Hola LM,

    Ya te estoy enviando un correo desde mi cuenta personal, perdona por la tardanza pero también tengo mi trabajo y en mi blog contesto sólo en mi tiempo libre.

    Orlando.

  16. Juan Fuentes says:

    Hola!

    Gracias por publicar este contenido, yo tengo un servidor Linux RedHat AS3 y Oracle9i Release 9.2.0.6.0 – 64bit Production y logré configurarlo para que ejecute dbstart y dbshut cuando se encienda y apague el servidor, en este servidor existe un archivo initxxx.ora. Este servidor es de pruebas y backup, se instaló un nuevo servidor con Oracle Linux y Oracle9i Release 9.2.0.7.0 – 64bit Production, al intentar usar dbstart en este servidor me muestra el mensaje que no existe archivo initxxx.ora, me explicaron que este archivo no existe porque la base de datos en este nuevo servidor usa sfpile y no pfile para levantar.

    ¿Qué puedo hacer para utilizar dbstart utilizando spfile y no pfile?

    Gracias de antemano por la ayuda.

  17. Orlando Olguín Olvera says:

    Hola Juan.

    Como se ve en mi post, si está presente el spfile en el ORACLE_HOME/dbs en linux/windows o en ORACLE_HOME/database en windows, al levantar la instancia, será leido de manera automática.

    Si no está presente, tomará el pfile.

    Ambas opciones son al levantar la instancia de la misma forma, por lo tanto, no deberías tener problema, sólo levantar dicha instancia.

    Orlando.

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: