我如何知道我连接到了 Oracle RAC 的哪个节点?

我如何知道我连接到了 Oracle RAC 的哪个节点?

有没有一种简单的方法可以确定我连接到 Oracle 11g R2 系统的哪个 RAC 节点?我正在尝试执行一些故障转移测试,我想确保我的应用程序正确连接到一个节点,并且在此节点关闭后,节点可以顺利过渡到另一个节点,而前端没有任何明显的延迟。也许值得一提的是,我们使用了 TAF。

我考虑过为此使用企业管理器,但我猜想当我连接到运行它的一个节点并且该节点发生故障时,我将没有机会真正监视节点的连接状态。

答案1

针对您当前的会话?

从 gv$instance 中选择 host_name,其中 instance_number=userenv('instance');

对于所有会话:

从中选择 i.主机名、s.用户名
  gv$session 连接
  gv$instance i 开启(i.inst_id=s.inst_id)
在哪里
  用户名不为空;

答案2

对于当前会话:

SELECT sys_context('USERENV', 'INSTANCE') AS instance#,
       sys_context('USERENV', 'INSTANCE_NAME') AS instance_name
FROM dual

答案3

如果你已连接到 node1

SQL> select host_name from v$instance;
instance1

如果您已连接到 nodeN

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

答案4

当我试图想出一种在 RAC 环境中设置 ORACLE_SID 的方法时,我也在想同样的问题。我的一位 DBA 同事有一个方案,他查看 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

引用

相关内容