Oh No!!, perdi el spfile!!

Oh No!!, perdi el spfile!!

Raul Antonio Molina Alvarenga – Oracle ACE Associate

04-dec-2022

No se si alguna vez les ha pasado que por algún error involuntario o una falla han perdido el spfile, pfile, o init temporal, representando alguna que otra sudoración por no poder encender la instancia y que la base de datos de servicio.

En este articulo vamos a simular una falla frecuente en el mundo de los dbas, que también puede venir acompañada de la ejecución de un establecimiento  de parámetros  que imposibilita el arranque de la instancia.

Primero validamos que tenemos nuestro spfile  configurado y utilizado:

NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

spfile    
 string /opt/oracle/product/19c/dbhome_1/dbs/spfileORCLCDB.ora

SQL> 

SQL> show parameter name

NAME     TYPE VALUE

db_name      string ORCLCDB

SQL> 

Crearemos una copia del spfile como pfile.

Recordemos la definición:

pfile: archivo de parámetros en texto

spfile: archivo de parámetros en formato binario.

 

SQL> create pfile from spfile;

File created.

También crearemos un archivo de parámetros alterno, con nombre alterno.
SQL> create pfile='noperderpfile.ora' from spfile;

File created.

Es importante observemos donde esta el diag, la ruta de archivos de log y traces de la bd y el estado de la instancia:

SQL> show parameter diag

NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

diagnostic_dest      string /opt/oracle

SQL> 

 select status from v$instance;
STATUS

------------

OPEN

Comenzamos apagando la instancia:

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> 

Ahora vamos a simular la falla de perder el spfileSID, borramos el spfileSID, note que hay  un initSID, el archivo alterno de parámetros que nosotros creamos.

cd $ORACLE_HOME

[oracle@instance-20221204-1045 dbhome_1]$ cd dbs

[oracle@instance-20221204-1045 dbs]$ ls -lrt

total 28

-rw-r--r--. 1 oracle oinstall 3079 May 14  2015 init.ora

-rw-r-----. 1 oracle oinstall   24 Dec  4 21:42 lkORCLCDB

-rw-r-----. 1 oracle oinstall 2048 Dec  4 21:47 orapwORCLCDB

-rw-r-----. 1 oracle oinstall 3584 Dec  4 22:35 spfileORCLCDB.ora

-rw-r--r--. 1 oracle oinstall 1037 Dec  4 22:36 initORCLCDB.ora

-rw-r--r--. 1 oracle oinstall 1037 Dec  4 22:36 noperderpfile.ora

-rw-rw----. 1 oracle oinstall 1544 Dec  4 22:40 hc_ORCLCDB.dat

[oracle@instance-20221204-1045 dbs]$ rm spfileORCLCDB.ora 

[oracle@instance-20221204-1045 dbs]$ 

SQL> 

SQL> startup

ORACLE instance started.

Total System Global Area  473953632 bytes

Fixed Size     8897888 bytes

Variable Size   222298112 bytes

Database Buffers   234881024 bytes

Redo Buffers     7876608 bytes

Database mounted.

Database opened.

SQL> show parameter pfile
NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

spfile     string --> esta vacio, arranco con init

SQL> 


Notese que la instancia arranco, sin spfile, porque por default en el orden de precedencia al no encontrar spfileSID, busca initSID

y para el caso lo encontró en el directorio $ORACLE_HOME/dbs.

Vamos a provocar la falla , borrando el initSID

[oracle@instance-20221204-1045 dbs]$ ls

hc_ORCLCDB.dat  init.ora  initORCLCDB.ora  lkORCLCDB  noperderpfile.ora  orapwORCLCDB

[oracle@instance-20221204-1045 dbs]$ rm initORCLCDB.ora 

[oracle@instance-20221204-1045 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Dec 4 22:46:21 2022

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup 

ORA-01078: failure in processing system parameters

LRM-00109: could not open parameter file '/opt/oracle/product/19c/dbhome_1/dbs/initORCLCDB.ora'

SQL> 

Puede observarse que al no encontrar spfile ni init, no arranco la instancia

[oracle@instance-20221204-1045 dbs]$ ls

hc_ORCLCDB.dat  init.ora  lkORCLCDB  noperderpfile.ora  orapwORCLCDB

Vamos a reconstruir nuestro spfile del init que guardamos previamente con nombre personalizado.

[oracle@instance-20221204-1045 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Dec 4 22:46:44 2022

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> create spfile from pfile='noperderpfile.ora';

File created.

SQL> startup

ORACLE instance started.

Total System Global Area  473953632 bytes

Fixed Size     8897888 bytes

Variable Size   222298112 bytes

Database Buffers   234881024 bytes

Redo Buffers     7876608 bytes

Database mounted.

Database opened.

SQL> 


Esto creo el spfile y se puede observar en el $OH/dbs

 dbs]$ ls -lrt

total 31272

-rw-r--r--. 1 oracle oinstall     3079 May 14  2015 init.ora

-rw-r-----. 1 oracle oinstall       24 Dec  4 21:42 lkORCLCDB

-rw-r-----. 1 oracle oinstall     2048 Dec  4 21:47 orapwORCLCDB

-rw-r--r--. 1 oracle oinstall     1037 Dec  4 22:36 noperderpfile.ora

-rw-r-----. 1 oracle oinstall     3584 Dec  4 22:50 spfileORCLCDB.ora

-rw-rw----. 1 oracle oinstall     1544 Dec  4 22:50 hc_ORCLCDB.dat

-rw-r-----. 1 oracle oinstall 10682368 Dec  4 22:57 011eiomb_1_1

-rw-r-----. 1 oracle oinstall 10600448 Dec  4 22:57 snapcf_ORCLCDB.f

-rw-r-----. 1 oracle oinstall 10715136 Dec  4 22:57 c-2893648571-20221204-00

[oracle@instance-20221204-1045 dbs]$ 

Otra forma utilísima de regenerar el init o spfile es usando los valores impresos en el alert en el diag repository.

[oracle@instance-20221204-1045 dbs]$ adrci

ADRCI: Release 19.0.0.0.0 - Production on Sun Dec 4 22:59:57 2022

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/opt/oracle"

adrci> show alert

Choose the home from which to view the alert log:

1: diag/rdbms/orclcdb/ORCLCDB

2: diag/rdbms/dummy/ORCLCDB

3: diag/tnslsnr/instance-20221204-1045/listener

Q: to quit

Please select option: 1

El contenido se observa:

Using parameter settings in server-side spfile /opt/oracle/product/19c/dbhome_1/dbs/spfileORCLCDB.ora

System parameters with non-default values:

  processes                = 300

  nls_language             = "AMERICAN"

  nls_territory            = "AMERICA"

  sga_target               = 452M

  control_files            = "/opt/oracle/oradata/ORCLCDB/control01.ctl"

  control_files            = "/opt/oracle/oradata/ORCLCDB/control02.ctl"

  db_block_size            = 8192

  compatible               = "19.0.0"

  undo_tablespace          = "UNDOTBS1"

  remote_login_passwordfile= "EXCLUSIVE"

  dispatchers              = "(PROTOCOL=TCP) (SERVICE=ORCLCDBXDB)"

  local_listener           = "LISTENER_ORCLCDB"

  audit_file_dest          = "/opt/oracle/admin/ORCLCDB/adump"

  audit_trail              = "DB"

  db_name                  = "ORCLCDB"

  open_cursors             = 300

  pga_aggregate_target     = 150M

  diagnostic_dest          = "/opt/oracle"



Guardamos un archivo editable

vi pfile.ora

processes=300

nls_language="AMERICAN"

nls_territory="AMERICA"

sga_target=452M

control_files="/opt/oracle/oradata/ORCLCDB/control01.ctl"

control_files="/opt/oracle/oradata/ORCLCDB/control02.ctl"

db_block_size=8192

compatible="19.0.0"

undo_tablespace="UNDOTBS1"

remote_login_passwordfile= "EXCLUSIVE"

dispatchers="(PROTOCOL=TCP) (SERVICE=ORCLCDBXDB)"

local_listener="LISTENER_ORCLCDB"

audit_file_dest="/opt/oracle/admin/ORCLCDB/adump"

audit_trail="DB"

db_name="ORCLCDB"

open_cursors=300

pga_aggregate_target=150M

diagnostic_dest="/opt/oracle"

Ahora generamos el spfile del contenido del archivo editable que previamente creamos e iniciamos la instancia:


SQL> create spfile from pfile='pfile.ora';

File created.

SQL> startup

ORACLE instance started.

Total System Global Area  473953632 bytes

Fixed Size     8897888 bytes

Variable Size   180355072 bytes

Database Buffers   276824064 bytes

Redo Buffers     7876608 bytes

Database mounted.

Database opened.

SQL>  

Espero les sea de utilidad.

Saludos

#OracleTipsSV