Modificación de parámetros en una arquitectura 'Multitenant' en Oracle 12c
La arquitectura 'Multitenant', nueva en Oracle Database 12c permite crear y mantener multiples bases de datos denominadas 'PLUGGABLE' en un contenedor o 'CONTAINER'. Esta característica involucra muchas ventajas, una de las cuales es que reduce costos de administración.
Esta ventaja precisamente que motiva a explicar como funciona la modificación de parámetros de instancia en una arquitectura de este tipo.
Debemos considerar los siguientes puntos importantes antes de comenzar con la explicación:
- En una arquitectura Multitenant existe una sola instancia por lo tanto existe un solo archivo de parámetros (PFILE o SPFILE).
- Existen ciertos parámetros que pueden ser modificados a nivel de Pluggable Database, veremos cuales son mas adelante.
Para que el concepto sea entendido he trabajado con el siguiente escenario: una arquitectura Multitenant con dos bases de datos Pluggable: PDB1 y PDB2.
Parámetros modificables a nivel de PDB
Existen al rededor de 380 parámetros modificables en una base de datos Oracle 12c, para poder conocer el valor y nombre de cada uno podemos utilizar la vista V$SYSTEM_PARAMETER. Todos las columnas de esta vista pueden ser apreciadas en V$SYSTEM_PARAMETER.
Para efectos de este articulo nos vamos a enfocar en las columnas:
- NAME: nombre del parámetro.
- VALUE: valor actual del parámetro.
- ISPDB_MODIFIABLE: YES|NO indica si el parametro es modificable a nivel de pluggable database.
- ISSYS_MODIFIABLE: YES|NO indica si el parámetros cobrara efecto solo después de reiniciar la instancia.
- CON_ID: Indica, para los parámetros que apliquen, para que pluggable database corresponde el cambio. Si el valor es de 0 el valor aplica para el contenedor (CDB).
Para saber, entonces, que parámetros pueden tomar efecto a nivel de pluggable database usamos la siguiente consulta:
SQL> select name,ispdb_modifiable,issys_modifiable from v$system_parameter
2 where ispdb_modifiable='TRUE';
NAME ISPDB_MODIFIABLE ISSYS_MODIFIABLE
----------------------------- -------------------------- ------------------------------
sessions TRUE IMMEDIATE
timed_statistics TRUE IMMEDIATE
timed_os_statistics TRUE IMMEDIATE
resource_limit TRUE IMMEDIATE
nls_language TRUE FALSE
nls_territory TRUE FALSE
star_transformation_enabled TRUE IMMEDIATE
parallel_degree_policy TRUE IMMEDIATE
parallel_io_cap_enabled TRUE IMMEDIATE
optimizer_index_cost_adj TRUE IMMEDIATE
optimizer_index_caching TRUE IMMEDIATE
query_rewrite_enabled TRUE IMMEDIATE
query_rewrite_integrity TRUE IMMEDIATE
workarea_size_policy TRUE IMMEDIATE
optimizer_dynamic_sampling TRUE IMMEDIATE
statistics_level TRUE IMMEDIATE
cursor_bind_capture_destination TRUE IMMEDIATE
skip_unusable_indexes TRUE IMMEDIATE
optimizer_secure_view_merging TRUE IMMEDIATE
ddl_lock_timeout TRUE IMMEDIATE
deferred_segment_creation TRUE IMMEDIATE
optimizer_use_pending_statistics TRUE IMMEDIATE
...
185 rows selected.
Dependiendo del estado actual de la base de datos obtendrán un listado de los mismos o mas parámetros.
Modificando parámetros en una PDB
Para el siguiente ejemplo voy a utilizar de referencia el parámetro CURSOR_SHARING, utilizado para establecer el comportamiento del optimizador de consultas durante el parseo de sentencias SQL. Sus valores posibles son SIMILA | EXACT | FORCE.
Valor inicial: solo existe un valor para el CDB y el mismo es heredado por todas las PDB's.
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
------------------ ---------------------- ----------
cursor_sharing EXACT 0
Modificando el parámetro en PDB1:
SQL> alter session set container=pdb1;
Session altered.
SQL> alter system set cursor_sharing='FORCE' scope=memory;
System altered.
SQL> alter session set container=cdb$root;
Session altered.
Podeos ver que añade una nueva fila a la vista v$system_parameter con el valor actual e inmediato para PDB1 consecuencia de utilizar SCOPE=MEMORY.
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
--------------------- ---------------------- ----------
cursor_sharing EXACT 0
cursor_sharing FORCE 3
Modificando el parámetro en PDB2:
SQL> alter session set container=pdb2;
Session altered.
SQL> alter system set cursor_sharing = 'FORCE' scope=spfile;
System altered.
SQL> alter session set container=cdb$root;
Session altered.
En este caso, el valor no se agrega a la vista debido al valor de SCOPE=SPFILE.
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
--------------------- ---------------------- ----------
cursor_sharing EXACT 0
cursor_sharing FORCE 3
El valor tomara efecto hasta que se inicie nuevamente, ya sea la PDB2 o el CDB completo.
SQL> alter pluggable database pdb2 close;
Pluggable database altered.
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
--------------------- ---------------------- ----------
cursor_sharing EXACT 0
cursor_sharing FORCE 3
cursor_sharing FORCE 4
De lo visto anteriormente podemos definir las siguientes reglas y comportamiento cuando modificamos parámetros en una base de datos pluggable:
- Si utilizamos SCOPE=MEMORY el cambio toma efecto inmediatamente solo para la PDB en la que estamos ubicados. El valor se pierde si:
- Se reinicia la PDB
- Se reinicia la CDB
- Se establece el valor a nivel de CDB con valor de SCOPE=MEMORY o BOTH.
- Si utilizamos SCOPE=SPFILE el cambio toma efecto solo para la PDB y es efectivo hasta que se reinicie la PDB o se reinicie el contenedor completo.
- Si utilizamos SCOPE=BOTH el cambio toma efecto solo para la PDB y es inmediato ademas de prevalecer si hay un reinicio de PDB o de CDB.
Modificando parametros en una CDB
La modificación de parametros a nivel de Container ahora incluye una nueva sentencia, que permite aplicar el cambio efectuado -para los parámetros con ISPDB_MODIFIABLE=TRUE- a todas las PDB o solo al Contenedor.
La sentencia ALTER SYSTEM SET ahora agrega el parámetro CONTAINER que puede tomar valores ALL | CURRENT.
Cuando utilizamos CONTAINER=ALL, los parametros antes definidos para cada PDB son reemplazados por el valor establecido en la sentencia ALTER SYSTEM ejecutado en el CDB:
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter system set cursor_sharing='SIMILAR' container=all;
System altered.
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
--------------------- ---------------------- ----------
cursor_sharing SIMILAR 0
Cuando utilizamos CONTAINER = CURRENT solo el valor del CDB se modifica y los valores antes establecidos para cada PDB se conservan:
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
--------------------- ---------------------- ----------
cursor_sharing SIMILAR 0
cursor_sharing FORCE 3
cursor_sharing FORCE 4
SQL> alter system set cursor_sharing='EXACT' container=current;
System altered.
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
--------------------- ---------------------- ----------
cursor_sharing EXACT 0
cursor_sharing FORCE 3
cursor_sharing FORCE 4
Finalmente, para regresar los valores default de un parámetro a nivel de PDB y CDB utilizamos la misma instrucción que en versiones anteriores a 12c.
SQL> alter system reset cursor_sharing scope=spfile;
System altered.
SQL> select name,value,con_id from v$system_parameter
2 where name='cursor_sharing';
NAME VALUE CON_ID
------------------ ---------------------- ----------
cursor_sharing EXACT 0
Comments
Post a Comment