Oracle

如何在 Oracle 18c XE 上使用 PDB 使用者 ID 進行連接?

  • February 14, 2020

我使用以下 SQL 命令在 Oracle 18c XE上創建了一個 PDB

create pluggable database virlux
admin user test1admin identified by test1pwd
file_name_convert = ('/pdbseed/', '/test1/')
;

現在,我嘗試使用以下命令使用新使用者 ID 直接連接到此 PDB

sqlplus test1admin/test1pwd@virlux

和 Oracle 回答錯誤 ORA-12541: no listener

然後我嘗試SYSTEM使用以下命令使用使用者 ID

sqlplus SYSTEM/syspwd@virlux

我得到了相同的錯誤號!

發生什麼了 ?

我已經正確設置了 ORACLE_HOME 和 SET_ADMIN 變數。

我在文件夾中tnsnames.ora找到的%TNS_ADMIN%文件包含以下行

# tnsnames.ora Network Configuration File: D:\Oracle\dbhomeXE\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

XE =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = XE)
   )
 )

VIRLUX =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = VIRLUX)
   )
 )  

XEPDB1 =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = XEPDB1)
   )
 )  

LISTENER_XE =
 (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))


ORACLR_CONNECTION_DATA =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
   )
   (CONNECT_DATA =
     (SID = CLRExtProc)
     (PRESENTATION = RO)
   )
 )

我剛剛在這個文件中添加了 VIRLUX。

我還使用net use命令停止並啟動了所有 Oracle 服務。

listener.ora 文件包含以下幾行

# listener.ora Network Configuration File: D:\Oracle\dbhomeXE\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

DEFAULT_SERVICE_LISTENER = XE

SID_LIST_LISTENER =
 (SID_LIST =
   (SID_DESC =
     (SID_NAME = CLRExtProc)
     (ORACLE_HOME = D:\Oracle\dbhomeXE)
     (PROGRAM = extproc)
     (ENVS = "EXTPROC_DLLS=ONLY:D:\Oracle\dbhomeXE\bin\oraclr18.dll")
   )
 )

LISTENER =
 (DESCRIPTION_LIST =
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
   )
 )

當我啟動 LSNRCTL STATUS 命令時,我得到

在此處輸入圖像描述

我終於找到了解決我的問題的方法,我將解釋以幫助其他使用者在同樣的情況下。

使用以下 sqlplus 命令連接到 Oracle 數據庫的 XE 實例沒有問題

sqlplus SYSTEM/password@XE

我的第一個問題是 PDB 並不總是打開的,每次我停止和啟動 DB 服務時,我都必須重新啟動 PDB。

為避免這種情況,我執行了以下 SQL 命令

alter PLUGGABLE DATABASE ALL OPEN;
alter PLUGGABLE DATABASE ALL SAVE STATE;

asktom.oracle.com上所述

現在,每次我停止並重新啟動 Oracle 數據庫服務時,VIRLUXPDB 都會正確啟動,但以下sqlplus命令繼續返回 Oracle 錯誤,現在是 ORA-01017。

sqlplus test1admin/test1pwd@virlux

SQL*Plus: Release 18.0.0.0.0 - Production on Mar. Janv. 14 08:41:41 2020
Version 18.4.0.0.0
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
ERROR: ORA-01017: invalid username/password; Logon denied

但是,如果我輸入以下命令,我將連接到 Oracle PDB!

sqlplus test1admin/test1pwd@localhost/virlux

我認為舊的眾所周知的 sqlplus 連接命令不適用於 PDB,唯一的解決方案是使用 TNSNAMES.ORA 文件中定義的主機名作為 PDB 名稱的前綴。

令人驚訝的是,返回錯誤消息說使用者/密碼無效的命令在沒有更改密碼的情況下被更正!

這個解決方案現在在我的 Windows Home 10 上執行良好。

192.168.0.14當您嘗試連接localhost用作地址的 TNS 條目時,您的偵聽器會監聽。這將在具有預設設置的 Linux 上執行,但在 Windows 上則無法執行,因此這是預期的行為。

C:\Windows\system32>lsnrctl status

LSNRCTL for 64-bit Windows: Version 18.0.0.0.0 - Production on 10-JAN-2020 22:57
:53

Copyright (c) 1991, 2018, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.241)(PORT=1521
)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 64-bit Windows: Version 18.0.0.0.0 - Produ
ction
Start Date                10-JAN-2020 22:54:03
Uptime                    0 days 0 hr. 3 min. 52 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           XE
Listener Parameter File   C:\app\oracle\product\18.0.0\dbhomeXE\network\admin\li
stener.ora
Listener Log File         C:\app\oracle\product\18.0.0\diag\tnslsnr\W7VPN1\liste
ner\alert\log.xml
Listening Endpoints Summary...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.241)(PORT=1521)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
 Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

C:\Windows\system32>tnsping xe

TNS Ping Utility for 64-bit Windows: Version 18.0.0.0.0 - Production on 10-JAN-2
020 22:57:56

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

Used parameter files:
C:\app\oracle\product\18.0.0\dbhomeXE\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhos
t)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
TNS-12541: TNS:no listener

C:\Windows\system32>

將偵聽器更改為在 localhost 上偵聽,或者將 tnsnames.ora 條目(LISTENER_XE、virlux)更改為使用192.168.0.14.

引用自:https://dba.stackexchange.com/questions/256722