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 进行连接的主要内容,如果未能解决你的问题,请参考以下文章