如何在不使用 sqlplus 或 srvctl 的情况下在 oracle 中查找数据库名称?

How to find database name in oracle without using sqlplus or srvctl?

我想知道在不连接数据库的情况下查找数据库名称的不同方法,既不使用 sqlplus 也不使用 srvctl

在 Oracle 中,假设我在 RAC 运行 数据库 pstest 中有 2 个节点。我可以通过简单地连接到任何一个数据库实例和查询来获取数据库名称,如下所示

SQL> select name from v$database;
NAME
---------
PSTEST

SQL> show parameter db_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      pstest`

但我需要知道如何在不通过 sqlplus 连接到数据库的情况下获取此处的数据库名称 pstest(因此以上两个都没有用)。

因为我的 pstest 数据库在 2 个实例中是 运行 - pstest1 在 node1 上,pstest2 在 node2 上。所以我可以使用 srvctl 如下

  srvctl status database -d pstest
  Instance pstest1 is running on node1
  Instance pstest2 is running on node2

但是如何在不使用 srvctlsqlplus 的情况下让 <db_name>srvctl 中使用?

提前致谢。

甚至不理解你为什么需要这个,这有点奇怪,一种方法是(考虑到你正在使用 Oracle RAC

这种情况下的效用是csrsctl

例子

srvctl status database -d otcgr2ng
Instance otcgr2ng1 is running on node scglvdoraci0009
Instance otcgr2ng2 is running on node scglvdoraci0010
db_name=$(crsctl stat res -t | grep ".db$" | grep -v mgmt | awk -F '.' '{print }')
srvctl status database -d ${db_name}
Instance otcgr2ng1 is running on node scglvdoraci0009
Instance otcgr2ng2 is running on node scglvdoraci0010

我所做的是使用 crsctl 获取数据库名称。显然,它只适用于你有一个数据库的场景。

CRSCTL is an interface between you and Oracle Clusterware, parsing and calling Oracle Clusterware APIs for Oracle Clusterware objects. You can use CRSCTL commands to perform several operations such as Starting and stopping Oracle Clusterware resources, Enabling and disabling Oracle Clusterware daemons, Checking the health of the cluster, etc...

我删除了 mgmtdb,它是 Grid Infrastructure 的内部数据库。如果 Oracle RAC 中有多个数据库,则

for db_name in $(crsctl stat res -t | grep ".db$" | grep -v mgmt | awk -F '.' '{print }')
do
echo $db_name
done