SQLPLUS 连接字符串不适用于 Oracle 21c CDB/PDB

问题描述 投票:0回答:1

我已经创建了名为 netcoolc 的 Oracle 21 CDB,但由于某种原因,我无法使用正确的连接字符串与 sys 用户连接...

[reporter@iqlinkxg02 ~]$ sqlplus sys/"PW"@netcoolc as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Nov 15 12:51:39 2023
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified


Enter user-name: 

...但是我得到了 tnsping 的正确答案...

[reporter@iqlinkxg02 ~]$ tnsping netcoolc

TNS Ping Utility for Linux: Version 21.0.0.0.0 - Production on 15-NOV-2023 12:52:38

Copyright (c) 1997, 2021, Oracle.  All rights reserved.

Used parameter files:
/opt/oracle/product/21c/dbhome_1/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = iqlinkxg02)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = netcoolc)))
OK (0 msec)
[reporter@iqlinkxg02 ~]$ 

...最奇怪的是我可以使用以下字符串登录...

[reporter@iqlinkxg02 ~]$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Nov 15 12:53:49 2023
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.


Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT
SQL> 

您可以在下面找到操作系统用户.bash_profile文件的内容...

# Oracle 21c netcool  Environment Variables - START
ORACLE_BASE=/opt/oracle; export ORACLE_BASE
ORACLE_HOME=${ORACLE_BASE}/product/21c/dbhome_1; export ORACLE_HOME
ORACLE_SID=netcoolc; export ORACLE_SID
PATH=$ORACLE_HOME/bin:$ORACLE_HOME/perl/bin:$PATH; export PATH
NLS_LANG=american_america.WE8ISO8859P1; export NLS_LANG
# Oracle 21c netcool Environment Variables - END

...我在此附上 tnsnames.ora 文件的内容...

netcoolc =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = iqlinkxg02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = netcoolc)
    )
  )

任何建议、顶部或帮助将不胜感激!

我尝试通过其他 CDB 环境进行故障排除,其中我具有相同的设置,但具有不同的 CDB 和用户名。那里一切正常,我找不到小故障。

oracle sqlplus oracle21c cdb
1个回答
0
投票

根据 tnsnames.ora 文件的内容,您已确定数据库已启动,IPC 连接 (

sqlplus / as sysdba
) 正在工作,并且 tnsnames.ora 中的 TNS 别名有效。请注意,
tnsping
仅验证侦听器在目标主机/端口上是否处于活动状态。它不会专门使用侦听器解析 service_name。

关键是你对这个命令的描述:

sqlplus sys/"PW"@netcoolc as sysdba

导致

ORA-12154: TNS:could not resolve the connect identifier specified

我们知道“netcoolc”的连接标识符是有效的,因此这表明该命令正在将“其他东西”传递给侦听器。唯一可能发生的情况是密码中嵌入了 @。 sqlplus实际看到的是这样的:

sqlplus sys/p@ssword@netcoolc as sysdba

然后尝试在 tnsnames.ora 中查找“@ssword”,当然找不到它。从命令行中删除密码(其中 sqlplus 会误解内容),然后在提示符下单独输入密码应该可以解决问题。

从命令行使用 Oracle 工具时,此类问题很常见。根据我的经验,唯一似乎在任何地方都没有任何问题的特殊字符是下划线,

_

也就是说,如果您需要定期从命令行编写此类脚本,我“强烈”建议使用 Oracle Wallet 来存储数据库凭据。在命令行上公开凭据是一种“非常”糟糕的安全实践。请参阅此处的文档:

https://www.oracle.com/technetwork/database/security/twp-db-security-secure-ext-pwd-stor-133399.pdf

这里:https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-authentication.html#GUID-3EA07020-A9F3-4FF9-9518-E1AEA3BDDBBE 基本步骤是:

创建钱包

将用户名/密码凭据添加到钱包

配置sqlnet.ora指向钱包
  • 使用类似
  • sqlplus /@pdb_tns_alias
  • 的内容进行连接
  • 如果您需要支持不同的用户凭据,则需要为每个用户提供单独的 TNS 别名。
© www.soinside.com 2019 - 2024. All rights reserved.