我已经创建了名为 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 和用户名。那里一切正常,我找不到小故障。
根据 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
的内容进行连接