Oracle 12c: Oracle Net – SID vs. SERVICE_NAME – USE_SID_AS_SERVICE_lsnr_name

14. Juli 2014 Aus Von Markus Flechtner

Im Kontext der Oracle 12c Multitenant-Architektur ist es klar: Ein Remote-Connect zur Datenbank mit den Parametern “Hostname – Port – ORACLE_SID” ist nicht sinnvoll. Denn mit der ORACLE_SID landet man im root-Container (CDB$ROOT) der zur angegebenen ORACLE_SID gehörigen Container Datenbank.
Dort haben Applikationen und ihre User nichts zu suchen. Für Applikationen gibt es Pluggable Databases, die über entsprechende Datenbank-Services erreicht werden können.
Aber wie mache ich es, wenn ein Applikation einen festen Connect-String mit “ORACLE_SID=..” vorschreibt? Wie komme ich dann zur meiner PDB?

Die Lösung ist der listener.ora-Parameter “USE_SID_AS_SERVICE_listener_name=ON”.
Dieser sorgt dafür, dass ein Connect-String mit “ORACLE_SID=” intern in “SERVICE_NAME=” geändert wird und dass somit eine Verbindung mit dem entsprechenden Datenbank-Service aufgebaut wird.

Beispiel:

Meine CDB (ORACLE_SID=CDB1) enthält zwei Pluggable Databases:

SQL> select name,open_mode from v$pdbs;
NAME OPEN_MODE
------------------------------ ----------
PDB$SEED READ ONLY
CRM01 READ WRITE
CRM02 READ WRITE

Dazu passend habe ich folgenden tnsnames.ora-Eintrag:

crm02_sid.world =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = nf12cdba)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID=crm02.world)
)
)

Und der connect mit diesem Connect-String landet dann in der passenden PDB:

oracle> sqlplus system/manager@crm02_sid
SQL*Plus: Release 12.1.0.1.0 Production on Mon Jul 14 17:43:21 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.

Last Successful login time: Sat Jul 12 2014 21:34:56 +02:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show user
USER is “SYSTEM”

SQL> show con_name
CON_NAME
——————————
CRM02

Achtung: Hat der Service einen Domain-Anteil (wie in obigem Beispiel “.world”) muss dieser auch im tnsnames.ora-Parameter “SID” angegeben werden.