我已经创建了一个名为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:
字符串
..
[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和用户名。那里一切正常,我找不到小故障。
1条答案
按热度按时间iugsix8n1#
根据tnsnames.ora文件的内容,您已经确定数据库已启动,IPC连接(
sqlplus / as sysdba
)正在工作,并且tnsnames.ora中的TNS别名有效。请注意,tnsping
仅验证目标主机/端口上的侦听器是否处于活动状态。它不会专门使用侦听器解析service_name。关键是你对这个命令的描述:
字符串
这导致
型
我们知道“netcoolc”的连接标识符是有效的,所以这表明命令正在向侦听器传递 * 其他东西 *。唯一可能发生的情况是密码中嵌入了
@
。sqlplus实际看到的是:型
然后,它试图在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
基本步骤如下:
sqlplus /@pdb_tns_alias
的方式连接如果您需要支持不同的用户凭据,则需要为每个用户提供单独的TNS别名。