Oracle tiene más de 5000 parámetros ocultos o también llamados "underscore parameters" que oficialmente no se encuentran documentados y que tienen como característica que inicia con un guión bajo (_).Estos parámetros son utilizados por Oracle internamente para ajustes avanzados o para situaciones especiales de diagnóstico y según las notas de Oracle, no deberían ser modificados sin recomendación expresa de parte del equipo de soporte del MOS.
Sin embargo, algunos de ellos son útiles para cierto tipo de situaciones.
Un claro ejemplo de donde podemos utilizar estos 5391 parámetros ocultos de Oracle, es con el parámetro "_pdb_auto_save_state". En la descripción del parámetro nos dice, que este, puede salvar automáticamente el último estado guardado a nivel de la instancia en un contenedor de base de datos.
Con múltiples PDBs siendo creadas y borradas en ambientes de desarrollo y pruebas por ejemplo, es normal que nos pase que se nos olvide hacer el "ALTER PLUGGABLE DATABASE <pdb> SAVE STATE" despues de crear una instancia y abrirla para trabajar.
Cuando reiniciamos por algún motivo el servicio, en las carreras se nos olvida validar el estado de los PDBs e inicia a sonar el teléfono o a llegar infinida de mensajes por el sistema interno, de que no pueden conectarse a la base de datos.
Veamos como podría ayudarnos este parámetro a solucionar este problema.
En ejemplo a continuación, tenemos un CDB con los siguientes PDBs y su respectivo estado actual.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 MOUNTED
5 PDB1_DR MOUNTED
La base de datos PDB2 se encuentra únicamente montada.Procedemos a cambiar el estado de la PDB al estado Open.
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
5 PDB1_DR MOUNTEDAhora vamos a bajar el contenedor de la base de datos.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
Subimos el contenedor.
SQL> startup
ORACLE instance started.
Total System Global Area 7868511032 bytes
Fixed Size 9196344 bytes
Variable Size 1509949440 bytes
Database Buffers 6341787648 bytes
Redo Buffers 7577600 bytes
Database mounted.
Database opened.
Ahora validamos el estado de los PDBS.
Pueden confirmar que el PDB2 esta nuevamente montado, pero no abierto.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 MOUNTED
5 PDB1_DR MOUNTEDAhora vamos a setear el parámetro a nivel de contenedor de la base de datos.
Hacemos que el parámetro sea actualizado a nivel de memoria y del archivo SPFILE.
SQL> alter system set "_pdb_auto_save_state"=TRUE scope=both;
System altered.
Vamos a cambiar el estado del PDB2 a OPEN.
SQL> alter pluggable database PDB2 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
5 PDB1_DR MOUNTEDVolvemos a bajar y subir el contenedor.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 7868511032 bytes
Fixed Size 9196344 bytes
Variable Size 1509949440 bytes
Database Buffers 6341787648 bytes
Redo Buffers 7577600 bytes
Database mounted.
Database opened.
Al verificar el estado de los PDBs, tenemos una situación muy particular. A pesar que el PDB1 estaba en estado "OPEN" y que yo había salvado el estado de la PDB para futuros reinicios del CDB, resulta que no reconoce el cambio del parámetro dicha situación.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 READ WRITE NO
5 PDB1_DR MOUNTED
Modifiquemos entonces el estado de la PDB1 sin salvar el mismo.
SQL> alter pluggable database pdb1 open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
5 PDB1_DR MOUNTED
Bajamos el contenedor de base de datos y validamos el estado de los PDBs.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 7868511032 bytes
Fixed Size 9196344 bytes
Variable Size 1509949440 bytes
Database Buffers 6341787648 bytes
Redo Buffers 7577600 bytes
Database mounted.
Database opened.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
5 PDB1_DR MOUNTED
SQL>
Listo ahora si funcionó correctamente.!!!
Hay muchos parámetros y funcionalidades que podrían facilitar considerablemente ciertas tareas a las que no le ponemos atención en repetidas ocasiones, sólo tenemos que buscar, cual nos pueda servir y tener la consideración de que antes debemos informarnos que hacen y como pueden afectar el comportamiento de la base de datos.
No aplique este tipo de cambios preferiblemente en ambientes productivos.