需要帮助在 RAC 环境中找到与数据库实例对应的 Oracle 主路径。我知道实现相同目标的方法很少。在下面列出它们以避免相同的答案。
/etc/oratab
此文件不是强制性的,因此可能不包含所有实例信息。
解析 Listener.ora 的内容 在 RAC 环境中,listener.ora 可以位于非默认位置。
使用 TNS_ADMIN 查找 Listener.ora 位置并解析文件。
ORACLE_HOME 环境变量可能不会始终设置。
ps -ef | grep tns
从服务名称获取主路径。提供当前正在运行的侦听器的路径
select "SYSMAN"."MGMT$TARGET_COMPONENTS"."HOME_LOCATION"
from "SYSMAN"."MGMT$TARGET_COMPONENTS"
where "SYSMAN"."MGMT$TARGET_COMPONENTS"."TARGET_NAME" = <Database SID>
首次登录 oracle 后,可以删除架构 sysman。
SELECT NVL(SUBSTR(FILE_SPEC, 1, INSTR(FILE_SPEC, '\', -1, 2) -1) , SUBSTR(FILE_SPEC, 1, INSTR(FILE_SPEC, '/', -1, 2) -1)) FOLDER
FROM DBA_LIBRARIES
WHERE LIBRARY_NAME = 'DBMS_SUMADV_LIB';
因此,如果 DBA 在安装 Oracle 后更改 Oracle Home(以及 libqsmashr.so 的位置),则从上述查询中检索到的路径将无效。
. oraenv
仅适用于 11g
我试图找出一种适用于所有 Oracle 版本的通用方法,它不应该依赖于对 DBA 无用的任何内容。
除了上面列出的之外,您还有其他方法可以做到吗?
提前谢谢了。
小智 1
最好的机会是查看 /etc/oratab 或 /var/opt/oracle/oratab。如果您安装的每个 PATH 和/或 ORACLE_HOME 都硬编码在脚本中,那么您就不走运,就像您提到的任何其他选项一样。
即使您碰巧找到了一个listener.ora,它也很可能是为动态注册而设置的,在这种情况下您也不会在listener.ora 中找到您的ORACLE_HOME。另外,不要忘记listener.ora不需要位于ORACLE_HOME/network/admin中,它可以位于TNS_ADMIN、/etc/、/var/opt/oracle ...指向的任何位置。
顺便说一句:oratab 仅适用于所有 Oracle 版本,对于 v11,Oracle 确实包含对仅存在于 v11 中的脚本 (orabase) 的调用来设置 ORACLE_BASE。他们甚至以这样的方式做到这一点:您需要 OSDBA 权限才能运行该脚本。另请参阅11gR2 中的 oraenv 奇怪之处