检查 oracle sid 和数据库名称

Posted

技术标签:

【中文标题】检查 oracle sid 和数据库名称【英文标题】:Checking oracle sid and database name 【发布时间】:2011-09-11 09:37:10 【问题描述】:

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

我正在使用以下查询来检查 oracle SID

select instance from v$thread;

但表或视图不存在错误即将到来。

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

select name from v$database;

但表或视图不存在错误即将到来。

对以上两个问题有什么想法吗?

【问题讨论】:

使用 SELECT INSTANCE_NAME FROM V$INSTANCE; 【参考方案1】:

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

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

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

【讨论】:

感谢您的快速响应。instance 和 oracle SID 是否相同? @Adnan 它们不必相同,因为可能有多个数据库实例在一台机器上运行,它们由 SID 标识 @adnan 你得到你需要的值了吗? select sys_context('userenv','db_name') from dual; 用于数据库名称和 sid,我已经在答案中添加了。希望这能给你你想要的 请查看link【参考方案2】:

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

jdbc:oracle:thin:@<server_host>:1521:<instance_name>

以下命令会有所帮助:

用于检查 SID(或实例名称)的 Oracle 查询命令:

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

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

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

Att. 塞尔吉奥·马塞洛

【讨论】:

完美。这正是我想知道的,但不知道如何表达。 我也是。谢谢塞尔吉奥!【参考方案3】:

为了完整起见,您也可以使用 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

【讨论】:

上述查询不需要特殊权限。通过创建仅具有 CONNECT 权限的新用户进行验证。【参考方案4】:

V$ 视图主要是系统指标的动态视图。它们用于性能调整、会话监控等。因此默认情况下,访问权限仅限于 DBA 用户,这就是您收到 ORA-00942 的原因。

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

select * from global_name;

此视图已授予 PUBLIC,因此任何人都可以查询它。

【讨论】:

oracle SID 怎么样?有什么方法可以从 scott 账户查到吗? 这是服务名称,不是 SID。【参考方案5】:

sqlplus 命令提示符下输入

SQL> select * from global_name;

然后你会在命令提示符下看到结果

SQL ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM

这里第一个“ORCL”是数据库名称,可能是你的系统“XE”和其他oracle下载时给出的。

【讨论】:

谢谢,你让我开心。【参考方案6】:

如上所述,

select global_name from global_name;

是要走的路。

您无法查询 v$database/v$instance/v$thread,因为您的用户没有所需的权限。您可以通过以下方式授予他们(通过 DBA 帐户):

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

【讨论】:

【参考方案7】:

SID 似乎是 Oracle 环境中的一个重载术语。 有很多关于主题的答案说: SID = SELECT sys_context('USERENV', 'SID') FROM DUAL;

但是请注意,这会显示您当前的 session_id,并且会随着与数据库的每个新连接而更改。

当在同一个问题中引用 SID 和当前数据库名称时,可以安全地假设 OP 正在尝试在 tnsnames 或其他地方配置连接,而不是尝试识别当前连接会话的 session_id。

因此在这种情况下: SID = SELECT sys_context('userenv','instance_name') FROM dual;

SERVICE_NAME = select sys_context('userenv','service_name') from dual;

【讨论】:

【参考方案8】:

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

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker.

以上是关于检查 oracle sid 和数据库名称的主要内容,如果未能解决你的问题,请参考以下文章

如何查找 Oracle 服务名称

全局数据库名称.数据库名称.SID是什么关系?

oracle tnsname.ora中的SERVICE_NAME 代表实例的名称还是代表全局数据库的名称?

oracle 怎么查看当前数据库的名称

“oracle”怎么查看当前数据库的名称?

cx_Oracle 在连接字符串上使用 SID 而不是服务名称时不连接