Pregunta ¿Cómo puedo saber a qué nodo de mi RAC de Oracle estoy conectado?


¿Hay una manera fácil de determinar a qué nodo RAC de un sistema Oracle 11g R2 estoy conectado? Estoy tratando de realizar algunas pruebas de conmutación por error y quiero asegurarme de que mi aplicación esté conectada correctamente a un nodo y al apagar este nodo, la transición se realizará sin problemas a otro nodo sin ningún retraso notable en el extremo frontal. Tal vez vale la pena mencionar que hacemos uso de TAF.

Consideré usar Enterprise Manager para esto, pero supongo que cuando esté conectado a un nodo que lo ejecute y este nodo se caiga, no tendré la oportunidad de monitorear el estado de conectividad de los nodos.


5
2018-02-01 11:21


origen




Respuestas:


¿Para tu sesión actual?

seleccione host_name desde gv $ instance donde instance_number = userenv ('instance');

Para todas las sesiones:

seleccione i.host_name, s.username desde
  gv $ session s join
  gv $ instance i en (i.inst_id = s.inst_id)
dónde
  el nombre de usuario no es nulo;

5
2018-02-01 12:35



OK, así que esto me muestra cómo mi propia sesión está conectada. ¿Hay alguna posibilidad de que pueda monitorear a otros también? ¿Si inicio sesión con sqlplus para comprobar la aplicación web que se registra con una sesión diferente? - Stephan
USERENV funciona pero Oracle recomienda sys_context en lugar, sys_context('userenv', 'instance'). En 8i: Oracle recomienda que utilice la función de contexto de la aplicación o la función SYS_CONTEXT con la opción USERENV.  docs.oracle.com/cd/A87860_01/doc/server.817/a85397/… - Shannon Severance
De 9i a 11gR2: USERENV es una función heredada que se conserva por compatibilidad con versiones anteriores. Oracle Corporation recomienda que use la función SYS_CONTEXT con el espacio de nombres USERENV incorporado.  docs.oracle.com/cd/A91202_01/901_doc/server.901/a90125/…  docs.oracle.com/cd/E11882_01/server.112/e26088/… - Shannon Severance


Para la sesión actual:

SELECCIONE sys_context ('USERENV', 'INSTANCE') COMO instancia #,        sys_context ('USERENV', 'INSTANCE_NAME') AS nombre_instancia   DESDE DOBLE


4
2018-02-01 12:39





Si estás conectado a node1

SQL> select host_name from v$instance;
instance1

Si estás conectado a nodeN

SQL> select host_name from v$instance;
instanceN

Si quieres conocer todas las instancias y todos los nodos.

SQL> select instance_name,host_name from gv$instance;

o

$ crsctl stat res -t
cluster resource
 1 node host1  online
 2 node host2  online
 n node hostn  offline

2
2017-10-22 08:52





SELECT sid,serial#, inst_id,username,event,ownerid
    FROM GV$SESSION
    WHERE sid=(select sid from v$mystat where rownum=1);

0
2018-05-30 11:19



Un poco de contexto para lo que hace esta consulta, o cualquier texto además de la consulta en sí sería genial ... - GregL
La vista v$mystatcontiene (en todas las filas) el SID de la sesión que lo está consultando, por lo que puede obtener el valor de la primera fila (rownum=1). Este truco es usado a menudo y funciona bien. en una sola instancia, pero aquí definitivamente falla. El problema es que una sesión se identifica con sid**Y** serial#. Varias instancias pueden tener una sesión con una misma sid pero diferente serial#. Fácil de ser comprobado con select sid, count(*) from GV$SESSION group by sid having count(*) > 1. Así que este enfoque es NO GO! - Marmite Bomber


Me preguntaba lo mismo que intenté encontrar una manera de configurar ORACLE_SID en un entorno de RAC. Uno de mis colegas DBA tenía un esquema en el que observaba el proceso pmon y extraía el último dígito como número de instancia, pero eso solo funcionaba si la instancia se estaba ejecutando. La siguiente es mi solución como código personalizado al final de oraenv (renombrado a oraenvr), que tomará el número de nodo como el último dígito del nombre de la instancia en ejecución o extraerá el último dígito de una instancia de ASM en ejecución. Solo necesita hacer esto para instancias que no sean ASM, porque con ASM, el nombre de la base de datos en / etc / oratab también es el nombre de la instancia (por ejemplo, + ASM1). Pero, nuevamente, necesitará que se ejecute la base de datos o la instancia de ASM para que tenga un proceso en ejecución desde el cual obtener el número de nodo.

#
# Install any "custom" code here
#
# Add proceeding digit to ORACLE_SID if it's a database instance
#
if [ `expr $ORACLE_SID|cut -c1-4` != "+ASM" ]; then ## ASM instance name is also the /etc/oratab database name, so we don't need to change it.
   len=`ps -ef|grep smon|grep $ORACLE_SID|wc -c`
   if [ $len != "0" ]; then # we found the running non-ASM database instance
      len1=`expr $len - 1`
      nodenum=`ps -ef|grep smon|grep $ORACLE_SID|cut -c$len1-$len`
   else ## use ASM instance as node number reference since database instance is probably down.
      len=`ps -ef|grep smon|grep ASM|wc -c`
      len1=`expr $len - 1`
      nodenum=`ps -ef|grep smon|grep ASM|cut -c$len1-$len`
   fi
   ORACLE_SID=$ORACLE_SID$nodenum
fi

Blockquote


0
2018-06-01 15:06