SQLPLUS:如何使用默认服务 SYS$USERS 进行连接

Posted

技术标签:

【中文标题】SQLPLUS:如何使用默认服务 SYS$USERS 进行连接【英文标题】:SQLPLUS: How to connect using default service SYS$USERS 【发布时间】:2020-09-04 08:22:02 【问题描述】:

我们有一个使用 SQLPLUS 命令连接到 Oracle DB 的旧代码:

sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/$SERVICE_NAME"

变量 USERNAME、PASSWORD、HOST、PORT 和 SERVICE_NAME 的值是使用外部属性文件配置的。当我们拥有具有服务名称的数据库时,此代码有效。在我们的例子中,数据库有默认服务:

SYS_CONTEXT('USERENV','SERVICE_NAME')                                                                                                                                                                                                                           
-------------------------------------
SYS$USERS

DB 只有 SID:

SYS_CONTEXT('USERENV','SID')                                                                                                                                                                                                                                    
----------------------------
521

有什么方法可以使用默认服务名称连接到 Oracle DB?例如

sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/SYS$USERS"

失败并出现错误: 错误:

ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor

我们还尝试将 SID 设置为:

sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT/521"

失败并出现错误:

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor

无法更改此旧版应用的代码或更改数据库以添加服务名称。请让我知道是否有任何解决此问题的方法。

【问题讨论】:

SID 将带有冒号:sqlplus "$USERNAME/$PASSWORD@//$HOST:$PORT:521" SYS$USERS 是内部使用的特殊服务;它是未为连接指定“真实”服务名称时使用的默认服务。我不确定您是否可以明确连接到它,因为网络侦听器不会注册它。您必须使用已向侦听器注册的服务名称或 SID 才能接收远程连接。 除了@pmdba cmets,请意识到在shell脚本中,次出现的'$'是一个标记,表示替换名称后面的变量的值'$'。这就是您用于 $USERNAME、$PASSWORD、$HOST、$PORT 的内容。现在,考虑一下“SYS$USERS”会发生什么 出于同样的原因,您不需要密码中的 $,也不需要密码中的“@”。 这里的“SID”一词有多种含义。您的 SYS_CONTEXT 查询实际上是返回会话标识符,而不是系统标识符。试试这个:SYS_CONTEXT('userenv', 'db_name'). @JonHeller:即使使用 db_name,我们也会收到 ORA-12514 错误:( 【参考方案1】:

您误用 sys_context 来确定 SERVICE_NAME 或 SID 的正确值。这不是 SYS_CONTEXT 报告的内容。这里的“sid”是你的 session_id,而不是数据库的系统 id。我不确定 SYS.USERS 在这种情况下到底代表什么,但它肯定不是您连接到数据库的服务名称。你应该看看 v$parameter:

 select name, value from v$parameter where name='service_names';

或者更好的是,只需查看“lsnrctl status”的输出即可向您展示侦听器_does_ 知道的内容。

从未见过为 SYS$USERS 服务的侦听器。

【讨论】:

以上是关于SQLPLUS:如何使用默认服务 SYS$USERS 进行连接的主要内容,如果未能解决你的问题,请参考以下文章

oracle10g 我装好以后,登录sqlplus时用户名和密码在那里可以得到

oracle sqlplus常用命令

oracle sqlplus常用命令

oracle sqlplus常用命令

如何解锁 sqlplus 用户?

oracle sqlplus常用命令