检查 Oracle 实例 ID 和数据库名称。

131

我想要检查SID和当前数据库名称。

我使用以下查询来检查Oracle SID:

select instance from v$thread;

但是出现了表或视图不存在的错误。

我正在使用以下查询来检查当前数据库名称。

select name from v$database;

但是出现了“表或视图不存在”的错误。

对于上述两个问题有任何想法吗?


使用 SELECT INSTANCE_NAME FROM V$INSTANCE; 命令。 - Ahmed Emad
8个回答

175

我认为 SELECT user FROM dual; 应该可以给你当前用户

SELECT sys_context('userenv','instance_name') FROM dual; 则是实例的名称

我相信你可以通过 SELECT sys_context('USERENV', 'SID') FROM DUAL; 得到 SID


1
感谢您的快速回复。实例和Oracle SID是同一件事吗? - Adnan
2
@Adnan,它们不需要相同,因为单台机器上可能有多个DB实例,它们通过SID进行识别。 - V4Vendetta
@adnan,你得到你需要的值了吗? - V4Vendetta
14
已经在答案中添加了数据库名称和SID,使用select sys_context('userenv','db_name') from dual;来获取。希望这能满足您的需要。 - V4Vendetta
2
请查看此链接:http://asktom.oracle.com/pls/asktom/f?p=100:11:1589451392620155::::P11_QUESTION_ID:318216852435 - V4Vendetta
显示剩余5条评论

83

如果像我一样,你的目标是获取数据库主机和SID以生成Oracle JDBC URL,则:

jdbc:oracle:thin:@<server_host>:1521:<instance_name>
以下命令可以帮助您:
Oracle查询命令以检查SID(或实例名称):

以下命令可以协助:

Oracle 查询命令以检查SID(或实例名称):

select sys_context('userenv','instance_name') from dual; 

Oracle查询命令可以检查数据库名称(或服务器主机):

select sys_context('userenv', 'server_host') from dual;

Att. Sergio Marcelo


太好了。这正是我想知道的,但不知道该如何表达。 - Addison
我也是。谢谢Sergio! - BenW

53

仅为完整性起见,您也可以使用ORA_DATABASE_NAME。

值得注意的是,并非所有的方法都会给出相同的输出:

SQL> select sys_context('userenv','db_name') from dual;

SYS_CONTEXT('USERENV','DB_NAME')
--------------------------------------------------------------------------------
orcl

SQL> select ora_database_name from dual;

ORA_DATABASE_NAME
--------------------------------------------------------------------------------
ORCL.XYZ.COM

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL.XYZ.COM

1
以上查询无需特殊权限。通过仅具有CONNECT特权的新用户进行验证。 - bdeem

27

V$视图主要是系统指标的动态视图。它们用于性能调整、会话监视等。因此,默认情况下只有DBA用户可以访问,这就是为什么您正在收到ORA-00942错误的原因。

找到数据库名称最简单的方法是:

select * from global_name;

这个视图被授予给PUBLIC,因此任何人都可以查询它。


Oracle SID是什么?有没有一种方法可以从scott账户中进行检查? - Adnan
1
那是服务名称,不是SID。 - jpmc26

6

sqlplus 命令提示符上输入命令

SQL> select * from global_name;

然后您将在命令提示符上看到结果。
SQL ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM

这里的第一个“ORCL”是数据库名称,可能是您系统上下载 Oracle 时提供的“XE”或其他名称。


谢谢,你让我的一天变得美好。 - Muhammad Ashikuzzaman

3
在Oracle环境中,SID似乎是一个混淆的术语。有许多关于这个话题的答案说:
SID = SELECT sys_context('USERENV', 'SID') FROM DUAL; 但请注意,这显示您当前的会话ID,并且在每次连接到数据库时都会更改。
当在同一问题中提及SID和当前数据库名称时,可以安全地假定OP正在尝试在tnsnames或其他地方配置连接,而不是尝试识别当前连接的会话ID。
因此,在这个上下文中:
SID = SELECT sys_context('userenv','instance_name') FROM dual; SERVICE_NAME = select sys_context('userenv','service_name') from dual;

3
正如上面所提到的,
select global_name from global_name;

这是正确的方式。

您无法查询v$database/v$instance/v$thread,因为您的用户没有所需的权限。您可以通过DBA账户授予它们:

grant select on v$database to <username here>;

0

SELECT sys_context('userenv','instance_name') FROM dual;

从双重表中选择sys_context('userenv','instance_name')


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案 - Procrastinator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接