En este post te voy a mostrar cómo cambiar el parámetro procesos en una base de datos Oracle RAC.
Puedes utilizar este mismo método para cualquier parámetro RAC que requiera que las instancias se reinicien para que el cambio tenga efecto.
En una situación ideal, sólo modificarías los parámetros del sistema y luego pararías y arrancarías cada instancia.
Pero esto no funcionó como esperaba porque algunos servicios sólo estaban disponibles en un nodo y no en el otro, así que tuve que reubicarlos y volver a intentarlo.
Te mostraré todos los detalles en este post.
Puedes comprobar los límites actuales del proceso Oracle con esta consulta
SELECT INST_ID, RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, LIMIT_VALUE
FROM GV$RESOURCE_LIMIT
WHERE RESOURCE_NAME IN ( 'sessions', 'processes');
INST_ID RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION LIMIT_VALU
---------- ------------------------------ ------------------- --------------- ----------
1 processes 120 250 700
1 sessions 128 255 1074
3 processes 699 700 700
3 sessions 708 711 1074
Primero conecto y compruebo los valores actuales.
set lines 200
column NAME format a40
column VALUE format a50
select INST_ID,NAME,VALUE from gv$parameter
where NAME in ('processes','sessions')
order by 2,1;
Una vez que tenga los valores, quiero cambiar el parámetro procesos a 1500.
sqlplus / as sysdba
alter system set processes=1500 scope=spfile sid='*';
Así que ahora lo ideal sería tener que parar y reiniciar cada una de las 2 instancias RAC.
[oracle@node1:XI002PRO1 ~]$ srvctl stop instance -d XI002PRO -i XI002PRO1
PRCD-1315 : failed to stop instances for database XI002PRO
PRCR-1014 : Failed to stop resource ora.xi002pro.db
PRCR-1065 : Failed to stop resource ora.xi002pro.db
CRS-2974: unable to act on resource 'ora.xi002pro.db' on server 'node1' because that would require stopping or relocating resource 'ora.xi002pro.xi002pro_bkup1.svc' but the appropriate force flag was not specified
Así que comprobé todos los servicios de esa base de datos.
[oracle@node1:XI002PRO1 ~]$ srvctl status service -d XI002PRO
Service XI002PROPLUGSVC is running on instance(s) XI002PRO1
Service xi002pro_bkup1 is running on instance(s) XI002PRO1
Service xi002pro_bkup2 is running on instance(s) XI002PRO3
Service XI002PROSVC is running on instance(s) XI002PRO1
Se quejaba del servicio xi002pro_bkup1.
Intenté trasladar todos los servicios al nodo 3.
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service XI002PROPLUGSVC -oldinst XI002PRO1 -newinst XI002PRO3
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service xi002pro_bkup1 -oldinst XI002PRO1 -newinst XI002PRO3
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service XI002PROSVC -oldinst XI002PRO1 -newinst XI002PRO3
Y luego volví a intentarlo
[oracle@node1:XI002PRO1 ~]$ srvctl stop instance -d XI002PRO -i XI002PRO1
[oracle@node1:XI002PRO1 ~]$ srvctl start instance -d XI002PRO -i XI002PRO1
Esta vez funcionó.
Ahora necesito reubicar los servicios de nuevo en el nodo 1.
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service XI002PROPLUGSVC -oldinst XI002PRO3 -newinst XI002PRO1
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service xi002pro_bkup1 -oldinst XI002PRO3 -newinst XI002PRO1
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service XI002PROSVC -oldinst XI002PRO3 -newinst XI002PRO1
Todavía hay un servicio que estaba en el nodo 3 y que tengo que mover al nodo 1 para iniciar y detener la instancia.
Pero tuve a otro problema.
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service xi002pro_bkup2 -oldinst XI002PRO3 -newinst XI002PRO1
PRCR-1106 : Failed to relocate resource ora.xi002pro.xi002pro_bkup2.svc from node xfpcon01db03 to node node1
PRCR-1089 : Failed to relocate resource ora.xi002pro.xi002pro_bkup2.svc.
CRS-2717: Server 'node1' is not in any of the server pool(s) hosting resource 'ora.xi002pro.xi002pro_bkup2.svc'
El problema es que este servicio xi002pro_bkup2 sólo tiene preferencia en el nodo 3 y ni siquiera está disponible en el nodo 1, como puedes ver con esto.
[oracle@node1:XI002PRO1 ~]$ srvctl config service -db XI002PRO -service xi002pro_bkup2
Service name: xi002pro_bkup2
Server pool:
Cardinality: 1
Disconnect: false
Service role: PRIMARY
Management policy: AUTOMATIC
DTP transaction: false
AQ HA notifications: false
Global: false
Commit Outcome: false
Failover type:
Failover method:
TAF failover retries:
TAF failover delay:
Connection Load Balancing Goal: LONG
Runtime Load Balancing Goal: NONE
TAF policy specification: NONE
Edition:
Pluggable database name:
Maximum lag time: ANY
SQL Translation Profile:
Retention: 86400 seconds
Replay Initiation Time: 300 seconds
Session State Consistency:
GSM Flags: 0
Service is enabled
Preferred instances: XI002PRO3
Available instances:
Así que añadí este servicio como disponible en el nodo 1 y preferido en el nodo 3 y volví a comprobarlo.
[oracle@node1:XI002PRO1 ~]$ srvctl modify service -db XI002PRO -service xi002pro_bkup2 -modifyconfig -preferred XI002PRO3 -available XI002PRO1
[oracle@node1:XI002PRO1 ~]$ srvctl config service -db XI002PRO -service xi002pro_bkup2
Service name: xi002pro_bkup2
Server pool:
Cardinality: 1
Disconnect: false
Service role: PRIMARY
Management policy: AUTOMATIC
DTP transaction: false
AQ HA notifications: false
Global: false
Commit Outcome: false
Failover type:
Failover method:
TAF failover retries:
TAF failover delay:
Connection Load Balancing Goal: LONG
Runtime Load Balancing Goal: NONE
TAF policy specification: NONE
Edition:
Pluggable database name:
Maximum lag time: ANY
SQL Translation Profile:
Retention: 86400 seconds
Replay Initiation Time: 300 seconds
Session State Consistency:
GSM Flags: 0
Service is enabled
Preferred instances: XI002PRO3
Available instances: XI002PRO1
Como se muestra arriba, ahora el servicio es preferente en el nodo 3 y está disponible en el nodo 1.
Así que ahora puedo trasladar el servicio al nodo 1.
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service xi002pro_bkup2 -oldinst XI002PRO3 -newinst XI002PRO1
Y luego puedo parar e iniciar la instancia en el nodo 3.
[oracle@node1:XI002PRO1 ~]$ srvctl stop instance -d XI002PRO -i XI002PRO3
[oracle@node1:XI002PRO1 ~]$ srvctl start instance -d XI002PRO -i XI002PRO3
Ahora vuelvo a trasladar el servicio al nodo 3.
[oracle@node1:XI002PRO1 ~]$ srvctl relocate service -db XI002PRO -service xi002pro_bkup2 -oldinst XI002PRO1 -newinst XI002PRO3
Y compruebo de nuevo los servicios cómo están distribuidos en cada nodo para ver si vuelven a estar como los tenía al principio.
[oracle@node1:XI002PRO1 ~]$ srvctl status service -d XI002PRO
Service XI002PROPLUGSVC is running on instance(s) XI002PRO1
Service xi002pro_bkup1 is running on instance(s) XI002PRO1
Service xi002pro_bkup2 is running on instance(s) XI002PRO3
Service XI002PROSVC is running on instance(s) XI002PRO1
Ahora valido que se ha aplicado el cambio en el parámetro procesos.
sqlplus / as sysdba
set lines 200
column NAME format a40
column VALUE format a50
select INST_ID,NAME,VALUE from gv$parameter
where NAME in ('processes','sessions')
order by 2,1;
INST_ID NAME VALUE
---------- ---------------------------------------- --------------------------------------------------
1 processes 1500
3 processes 1500
1 sessions 2272
3 sessions 2272
Así que todo parece ir bien.
Por supuesto, si haces una preparación antes de realizar la parada y arranque de cada instancia, podrías haber evitado todo esto durante la intervención.
Espero que te haya sido útil.