有没有一种简单的方法可以确定我连接到 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
引用