【问题标题】:Cannot connect to oracle database with SID无法使用 SID 连接到 oracle 数据库
【发布时间】:2019-05-20 04:48:33
【问题描述】:

我是全新的 oracle db 设置。这就是我下载并运行以下 oracle VM 的原因。对于我的项目特定目的,我做了几个步骤来获得具有适当权限的表空间和用户/方案,如下所示:

  1. create tablespace MYTABLESPACE datafile 'linux/path/MYTABLESPACE.DBF' size 4096m autoextend on next 512m maxsize 8192m;
  2. 创建由 MYUSER 默认表空间 MYTABLESPACE 标识的用户 MYUSER;
  3. 授予连接、资源、无限表空间、选择任意字典给 MYUSER;

默认配置文件存储在 ${ORACLE_HOME}/network/admin 中

listener.ora

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orclcdb)
      (SID_NAME = orclcdb)
      (ORACLE_HOME = /u01/app/oracle/product/version/db_1)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    )
  )

#HOSTNAME by pluggable not working rstriction or configuration error.
DEFAULT_SERVICE_LISTENER = (orclcdb)

tnsnames.ora

ORCLCDB=localhost:1521/orclcdb ORCL=  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )   )

使用上述配置我无法使用 SID 连接新创建的用户,请参见下表

在这种情况下会收到以下错误:

[72000][1017] ORA-01017:用户名/密码无效;登录被拒绝

有人可以澄清一下配置中遗漏了什么,因为 SID 连接是遗留应用程序的要求吗?

【问题讨论】:

  • ORCL 服务实际上是为 CDB 服务的,还是为 PDB 服务的?我不确定您是否可以使用 SID 连接到 12c+ 数据库 - 为什么旧应用程序必须使用 SID?
  • @AlexPoole 我刚刚检查过,看起来虚拟机默认使用 CDB。关于应用程序,我们有无法修改的旧版连接器。我已经尝试过使用服务名称,不幸的是它不起作用。
  • 我只是模拟了一个奇怪的行为,当我通过使用服务名称登录的系统用户创建用户时,用户可以使用服务名称登录,但使用 SID 失败。当我通过使用 SID 登录的系统用户创建用户时,用户可以使用 SID 登录,但使用服务名称失败。

标签: oracle


【解决方案1】:

问题中的情况在逻辑上是正确的,没有错,您不应该为 SID 和服务创建相同的普通用户,因为它们是两个独立的实例。
(除非您完全确定希望有两个相同的用户名在两个数据库上执行不同的任务)

我检查了数据库文件的数据库安装,有两个独立的数据库文件组位于两个单独的目录中,一个用于数据库实例(ORACLESID),一个用于数据库服务(ORACLEPDB)。

在我的 Oracle DB 安装中,

服务名称为:
“ORACLEPDB”,

SID 是:
“ORACLESID”

下面是我的文件结构:

bash-4.2# pwd
/opt/oracle/oradata/ORACLESID
bash-4.2#  ls -hal      
total 2.5G
drwxr-x--- 1 oracle oinstall 4.0K Jan 30 02:17 .
drwxr-xr-x 1 oracle dba      4.0K Jan 30 02:26 ..
drwxr-x--- 1 oracle oinstall 4.0K Jan 30 02:26 ORACLEPDB
-rw-r----- 1 oracle oinstall  18M Jan 30 12:47 control01.ctl
-rw-r----- 1 oracle oinstall  18M Jan 30 02:53 control02.ctl
drwxr-x--- 1 oracle oinstall 4.0K Jan 30 02:19 pdbseed
-rw-r----- 1 oracle oinstall 201M Jan 30 12:47 redo01.log
-rw-r----- 1 oracle oinstall 201M Jan 30 12:41 redo02.log
-rw-r----- 1 oracle oinstall 201M Jan 30 12:41 redo03.log
-rw-r----- 1 oracle oinstall 531M Jan 30 12:46 sysaux01.dbf
-rw-r----- 1 oracle oinstall 911M Jan 30 12:46 system01.dbf
-rw-r----- 1 oracle oinstall 129M Jan 30 12:23 temp01.dbf
-rw-r----- 1 oracle oinstall 341M Jan 30 12:46 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5.1M Jan 30 12:41 users01.dbf


bash-4.2# cd ORACLEPDB/
bash-4.2# pwd
/opt/oracle/oradata/ORACLESID/ORACLEPDB
bash-4.2# ls -hal
total 742M
drwxr-x--- 1 oracle oinstall 4.0K Jan 30 02:26 .
drwxr-x--- 1 oracle oinstall 4.0K Jan 30 02:17 ..
-rw-r----- 1 oracle oinstall 331M Jan 30 12:46 sysaux01.dbf
-rw-r----- 1 oracle oinstall 271M Jan 30 12:47 system01.dbf
-rw-r----- 1 oracle oinstall  37M Jan 30 02:54 temp01.dbf
-rw-r----- 1 oracle oinstall 101M Jan 30 12:46 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5.1M Jan 30 12:41 users01.dbf

为了验证这个假设,我创建了如下用户:
使用“ORACLESID”连接时的“SIDUSER” 使用“ORACLEPDB”连接时的“PDBUSER”

因此,在“SYSTEM”作为 SYSDBA 用户在基于 SID 的连接和基于服务的连接上创建两个用户之后,“all_users”表中会发生以下情况:

在基于 SID 的连接上,PDBUSER 确实存在:

 select * from all_users where username like '%USER';
 select * from global_name;

在基于服务名称的连接上,SIDUSER 确实存在:

得出的结论是,即使您启用了配置:
USE_SID_AS_SERVICE_LISTENER=on

使用 SID 和 Servicename 连接的用户,即使使用相同的用户名和密码,也在不同的数据库实例上工作,用户在任一数据库上所做的更改将不会在另一个数据库上看到。

【讨论】:

    【解决方案2】:

    默认情况下,您无法使用 SID 连接到 PDB。您必须启用USE_SID_AS_SERVICE_listener 参数才能使其工作(其中“listener”是您的侦听器的名称)。 See this examplethe docs。由于您的侦听器名为“LISTENER”,您应该可以将此行添加到 listener.ora 的末尾:

    USE_SID_AS_SERVICE_LISTENER=on 
    

    【讨论】:

    • 非常感谢您。这是我一直在寻找的。目前可以通过以下方式连接:jdbc:oracle:thin:@//localhost:1521/ORCL
    • 将条目放在 listener.ora 中 SID_LIST_LISTENER 部分之前,而不是文件末尾
    猜你喜欢
    • 2016-07-27
    • 2019-10-18
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多