Как узнать, к какому узлу моего Oracle RAC я подключен?
Есть ли простой способ определить, к какому узлу RAC системы Oracle 11g R2 я подключен? Я пытаюсь выполнить некоторые тесты отработки отказа и хочу убедиться, что мое приложение правильно подключено к одному узлу, и после закрытия этого узла узел плавно переходит на другой узел без какой-либо заметной задержки на внешнем интерфейсе. Может быть, стоит упомянуть, что мы используем TAF.
Я подумал об использовании Enterprise Manager для этого, но думаю, что когда я подключусь к одному узлу, на котором запущен em, и этот узел выйдет из строя, у меня не будет возможности отслеживать состояние подключения узлов.
5 ответов
Для вашей текущей сессии?
выберите имя_хоста из gv$instance, где instance_number=userenv('instance');
Для всех сессий:
выберите имя i.host_name, s.username из gv$session s присоединиться gv$instance i on (i.inst_id=s.inst_id) где имя пользователя не является нулевым;
Для текущей сессии:
SELECT sys_context ('USERENV', 'INSTANCE') AS instance #, sys_context ('USERENV', 'INSTANCE_NAME') AS имя_экземпляра FROM dual
Если вы подключены к node1
SQL> select host_name from v$instance;
instance1
Если вы подключены к узлу N
SQL> select host_name from v$instance;
instanceN
Если вам нравится знать все экземпляры и все узлы
SQL> select instance_name,host_name from gv$instance;
или же
$ crsctl stat res -t
cluster resource
1 node host1 online
2 node host2 online
n node hostn offline
SELECT sid,serial#, inst_id,username,event,ownerid
FROM GV$SESSION
WHERE sid=(select sid from v$mystat where rownum=1);
Мне было интересно то же самое, когда я пытался придумать способ установить ORACLE_SID в среде RAC. У одного из моих коллег-администраторов баз данных была схема, в которой он просматривал процесс pmon и извлекал последнюю цифру в качестве номера экземпляра, но это работало, только если экземпляр работал. Ниже приведено мое решение в виде пользовательского кода в конце oraenv (переименованного в oraenvr), который будет захватывать номер узла в качестве последней цифры имени запущенного экземпляра или извлекать последнюю цифру из запущенного экземпляра ASM. Это необходимо сделать только для экземпляров, не относящихся к ASM, поскольку в ASM имя базы данных в /etc/oratab также является именем экземпляра (например, +ASM1). Но, опять же, вам понадобится либо база данных, либо экземпляр ASM, поэтому у него будет запущенный процесс, из которого можно получить номер узла.
#
# 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