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