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

o7jaxewo  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(145)

我已经创建了一个名为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和用户名。那里一切正常,我找不到小故障。

iugsix8n

iugsix8n1#

根据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配置为指向Wallet
  • 使用类似sqlplus /@pdb_tns_alias的方式连接

如果您需要支持不同的用户凭据,则需要为每个用户提供单独的TNS别名。

相关问题