Inhaltsverzeichnis
Oracle 21c - SQL*Net Proxy und Firewall mit dem Oracle Connection Manager CMAN implementieren - Einsatz als Standby DB Proxy für ältere Java Apps
Aufgabe:
Analyse des Oracle CMAN bzgl. Einsatzes als SQL*Net Gateway/Proxy für ältere Java Applikationen, die den Oracle TAF Standard für das automatische Failover nicht beherrschen bzw. bei denen sich die Applikations-Verantwortlichen weigern diese Standard Verhalten von Oracle unter Java einzusetzen.
Mit dem Oracle Connection Manager, der CMAN, kann das SQL*Net Protokoll über einen Rechner zwischen verschiedenem Netzwerk „geroutet“ werden.
Der CMAN ist bereits sehr lange Bestandteil der Oracle Installation, heute kann das der CMAN in der Oracle Client Installation gefunden werden.
Ursprünglich war einer der Haupteinsatz Zwecke das Routen zwischen verschiedenen Netzwerk Protokollen, zum Beispiel in einer SPX/IPX Welt nach TCP/IP.
Heute ist der CMAN sehr praktisch um Proxy Funktionalitäten zwischen verschiedenen TCP/IP Netzen zu realisieren.
Details zu CMAN unter 12c auch siehe SQL*Net Proxy und Firewall mit dem 12c CMAN, dem Oracle Connection Manager implementieren
Im Grundprinzip hat sich seit 11g nicht viel verändert, hier eine weitere Übersicht dazu für 11g ⇒https://www.pipperr.de/knowhow/cman/Oracle_Connection_Manager_CMAN_doag_sig_security_mai_2015.pdf
Neu in 21c
Oracle Connection Manager hat die folgenden neuen Featuer:
- Parameter „USE_SERVICE_AS_TNSNAMES_ALIAS“ um eine Anfrage an eine passende DB weiterzuleiten OHNE das diese sich zuvor am CMAN angemeldet hat
- REST APIs for CMCTL Commands
- GROUP syntax for rules
- BANDWIDTH in bytes per second at service level
Lizenz Überlegungen
Leider ist der Oracle Connection Manager nur zusammen mit der Oracle EE Edition verfügbar, siehe für 21c hier ⇒ https://docs.oracle.com/en/database/oracle/oracle-database/21/dblic/Licensing-Information.html
Architektur
- Bündelt SQL*Net-Verbindungen
- Erweiterte Sicherheitsüberprüfungen
- Protokoll-Wandlung (TCP/IP –> SPX/IPX )
- Firewall-Architektur
Der Oracle Connection Manager wird über den cmctl gestartet, dieses Control Utility startet zuerst den Prozess cmadmin, dieser Prozess steuert den Listener und die Gateway Prozesse für das SQL*Net Routing.
CMAN in einer Standby Umgebung
Eine der Aufgaben kann es sein in einer Standby Umgebung den „Kunden“ auf die richtige, gerade aktive DB umzuleiten.
Normalerweise würde dazu TAF ⇒ Transparent Application Failover konfigurieren eingesetzt werden.
Siehe dazu auch für die Java Welt ⇒ Primary Note for Oracle JDBC High Availability Features (Doc ID 1100024.1) und 390923.1.
Hat man aber keine Einfluss mehr auf die Applikation, da diese zu alt ist oder die Maintainer der APP keine Lust mehr auf die Oracle Feature haben, müssen andere Lösungen gefunden werden.
Für eine Standby DB Umgebung können die folgenden Feature für eine Lösung eingesetzt werden:
- Datenbank (Single DB / RAC Cluster) registriert sich am CMAN
- CMAN kennt über TNS Auflösung des gewünschte Ziel
- Client kann per SID oder per Service Name auf CMAN zugreifen, CMAN kennt das Ziel und leitet automatisch weiter
Hier ist zu beachten das wir einen dedizierten Service Namen benötigen der NUR auf der Primary Seite der Standby Umgebung auch aktiv ist! Also nicht den Default Service der DB!
Da nun von der Applikation der CMAN angesprochen wird, ist darauf zu achten hier eigenen DNS Einträge dazu zu verwenden und nicht den Hostname! So kann im Fehlerfall z.B. über DNS auf eine weiteren CMAN verwiesen werden!
Auch hat das den Vorteil das Änderungen an der Infrastruktur nicht zu dutzenden von anzupassenden lokalen Installation führt!
CMAN Installation unter Linux 8
Ablauf:
- Basis Betriebssystem konfigurieren siehe Ein Oracle Linux 8 Basis System als Grundlagen für eine Oracle Clusterware und Datenbank Installation vorbereiten
- Bei Bedarf den Firewall Port freischalten, falls FW aktiviert
- Installationspacket für den Oracle Client auswählen und herunterladen
- Client Software inkl. CMAN installieren
- Client Software mit letzten Patch ausstatten (Stand 06.2022)
- Patch bzw. DATABASE RELEASE UPDATE 21.6.0.0.0 (Patch)
DATABASE RELEASE UPDATE 21.6.0.0.0 (Patch) p33843745_210000_Linux-x86-64.zip 876.1 MB (918682641 bytes) SHA-256 E55AF80672AC89C8D0A5EE531F4B9CD9AB8232DE9A4F0B32D9FF4A7041E8AEFA
- OPatch Patch - Patch 6880880: OPatch patch of version 12.2.0.1.29 or later = OPatch 12.2.0.1.30 for DB 21.0.0.0.0 (Apr 2022)
p6880880_210000_Linux-x86-64.zip SHA-1 132CE28CE48E74D33E5189A585026CEB7ED7DE12 SHA-256 DF6E3AA379725E9ABFF1AB3BB840263F186A10A05CEB9AED1544E81AA08A461E
- Connection Manager konfigurieren und starten
Betriebssystem vorbereiten
Im Prinzip kann die Client Installation auch gleich einer Basis Oracle Installation durchgeführt werden, siehe ⇒ Eine Oracle Linux 8 Umgebung für eine Oracle Installation vorbereiten.
Client mit Oracle Connection Manager installieren
Oracle User auf dem System anlegen und Oracle Base Verzeichnis anlegen.
Als User root das Oracle Basisverzeichnis anlegen:
mkdir -p /opt/oracle mkdir -p /opt/oracle/install chown -R oracle:oinstall /opt/oracle mkdir -p /opt/oraInventory chown oracle:oinstall /opt/oraInventory/ dnf install gcc ksh sysstat libnsl
Client Zip nach /opt/oracle/install kopieren und prüfen:
sha256sum LINUX.X64_213000_client.zip 595d8b59901c68979e2ff065210916857d0c17e64b07ef0180b92c4c3519249f LINUX.X64_213000_client.zip
Als Oracle User anmelden:
mkdir -p /opt/oracle/product/21c/client_1 cd /opt/oracle/install unzip LINUX.X64_213000_client.zip
Setup ausführen:
cd ./client ./runInstaller
Ablauf:
- Select Installation Type ⇒ Custom
- Specify Installation Location ⇒ Oracle Base = „/opt/oracle“ ; Oracle Home = „/opt/oracle/product/21c/client_1 > Next
- Create Inventory ⇒ Inventory Directory “/opt/oraInventory„ ⇒ Next
-
- SQL*Plus
- Oracle Connection Manager
- Oracle Net
- Oracle Listner
- Oracle Advanced Security
- Perform Prerequisite Check ⇒ Bei Problem fixen ⇒ Next
- Summary ⇒ Übersicht ⇒ „Save Response File“ ⇒ Install
- Install Product ⇒ Details über den Lauf über „Details“
- Root Script ausführen als root
/opt/oraInventory/orainstRoot.sh /opt/oracle/product/21c/client_1/root.sh
- Finish ⇒ close
Umgebung des Users einrichten:
vi .bashrc export ORACLE_BASE=/opt/oracle export ADR_BASE=${ORACLE_BASE} export ORACLE_HOME=/opt/oracle/product/21c/client_1 export PATH=$ORACLE_HOME/bin:$PATH . .bashrc
Patch einspielen
Nach der Installation des Clients auch gleich den letzten Patch einspielen.
Als User Oracle:
mkdir /opt/oracle/install/patch
Dateien nach /opt/oracle/install/patch kopieren.
Im ersten Schritt OPatch updaten ( OPatch 12.2.0.1.30 for DB 21.0.0.0.0 (Apr 2022) )
cd /opt/oracle/install/patch mv /opt/oracle/product/21c/client_1/OPatch /opt/oracle/product/21c/client_1/OPatch_06_2022 unzip p6880880_210000_Linux-x86-64.zip -d /opt/oracle/product/21c/client_1 /opt/oracle/product/21c/client_1/OPatch/opatch version OPatch Version: 12.2.0.1.30 OPatch succeeded.
Dann Patch einspielen:
unzip p33843745_210000_Linux-x86-64.zip cd 33843745 export ORACLE_HOME=/opt/oracle/product/21c/client_1/ /opt/oracle/product/21c/client_1/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./ .. Prereq "checkConflictAgainstOHWithDetail" passed. OPatch succeeded .. #wenn alles ok /opt/oracle/product/21c/client_1/OPatch/opatch apply
Installationsprobleme
Installation unter RedHat 8
Exception in thread „main“ java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.oiipg.OiipgPropertyLoader
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2023-09-20_11-07-18PM. Please wait ... The java.library.path system variable is missing or invalid. Please set java.library.path with a correct value and retry the operation. Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.oiipg.OiipgPropertyLoader at oracle.sysman.oii.oiip.oiipg.OiipgBootstrap.isCleanMachine(OiipgBootstrap.java:487)
Lösung:
dnf install libnsl.x86_64
Oracle Connection Manager Konfiguration
Konfiguration erstellen
User Oracle
Die Konfiguration erfolgt über die Datei $ORACLE_HOME/network/admin/cman.ora.
Erste Start Konfiguration erstellen:
cman_gpi = (configuration= (address=(protocol=tcp)(host=cman21c.pipperr.local)(port=1999)) (parameter_list = (aso_authentication_filter=off) (connection_statistics=yes) (log_level=admin) (max_connections=256) (idle_timeout=0) (inbound_connect_timeout=10) (session_timeout=0) (outbound_connect_timeout=0) (max_gateway_processes=16) (min_gateway_processes=2) (remote_admin=on) (trace_level=off) (trace_timestamp=off) (trace_filelen=1000) (trace_fileno=1) (max_cmctl_sessions=4) (event_group=init_and_term,memory_ops) (VALID_NODE_CHECKING_REGISTRATION=OFF) (REGISTRATION_INVITED_NODES = 10.10.10.*) (USE_SERVICE_AS_TNSNAMES_ALIAS=ON) (USE_SID_AS_SERVICE=ON) ) (rule_list= (rule= (src=*)(dst=*)(srv=*)(act=accept) (action_list=(aut=off)(moct=0)(mct=0)(mit=0)(conn_stats=on)) ) ( rule= (src=cman21c)(dst=127.0.0.1)(srv=cmon)(act=accept) ) ( rule= (src=cman21c)(dst=*)(srv=cmon)(act=accept) ) (rule= (src=10.10.10.1)(dst=*)(srv=GPI)(act=accept)) ) ) )
siehe auch siehe Support Node - Doc ID 733421.1
Starten
Das administrative Utility ist das Programm cmctl. Nach dem Start des cmctl muss sich mit dem „administer <cman_name>“ an den Connection Manager angemeldet werden.
Start:
cd $ORACLE_HOME/bin ./cmctl CMCTL> administer cman_gpi Current instance cman_gpi is not yet started Connections refer to (DESCRIPTION=(address=(protocol=tcp)(host=cman21c.pipperr.local)(port=1999))). The command completed successfully. CMCTL:cman_gpi> startup Starting Oracle Connection Manager instance cman_gpi. Please wait... CMAN for Linux: Version 21.0.0.0.0 - Production Status of the Instance ---------------------- Instance name cman_gpi Version CMAN for Linux: Version 21.0.0.0.0 - Production Start date 07-JUN-2022 13:58:50 Uptime 0 days 0 hr. 0 min. 9 sec Num of gateways started 2 Average Load level 0 Log Level ADMIN Trace Level OFF Instance Config file /opt/oracle/product/21c/client_1/network/admin/cman.ora Instance Log directory /opt/oracle/diag/netcman/cman21c/cman_gpi/alert Instance Trace directory /opt/oracle/diag/netcman/cman21c/cman_gpi/trace The command completed successfully. # Parameter anzeigen CMCTL:cman_gpi>show all listener_address | (DESCRIPTION=(address=(protocol=tcp)(host=cman21c.pipperr.local)(port=1999))) ... Number of filtering rules currently in effect: .. ...
Nach dem Start kann das Logfile unter $ORACLE_BASE/diag/netcman/cman21c/cman_gpi/trace eingesehen werden.
Über die PS Liste kann auch geprüft werden ob alle Connection Manager Prozesse auch laufen:
$ ps uafx | grep cm ../opt/oracle/product/21c/client_2/bin/cmadmin cman_gpi -inherit .. /opt/oracle/product/21c/client_2/bin/tnslsnr ifile=/opt/oracle/product/21c/client_2/network/admin/cman.ora cman_gpi -inherit -mode proxy .. /opt/oracle/product/21c/client_2/bin/cmgw cmgw0 0 16 cman_gpi SNLSM:e6e08000 0 .. /opt/oracle/product/21c/client_2/bin/cmgw cmgw1 1 16 cman_gpi SNLSM:e6e08000 0
Test mit der Start Konfiguration
Mit der obigen Start cman.ora arbeitet der Connection Manager ohne Einschränkungen.
Erster Test mit folgenden tnsnames.ora Eintrag:
cman_gpi_db= (DESCRIPTION = (SOURCE_ROUTE = YES) (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.96 )(PORT = 1999) ) (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.1 )(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME=GPI) ) )
Der Schlüssel zu diesem Eintrag ist der Parameter SOURCE_ROUTE, die Verbindung erfolgt zuerst an den CMan, der weiß dann über den zweiten ADRESS Eintrag wo hin die Verbindung geleitet werden soll.
Konfiguration "härten"
In der einfachen Basis Konfiguration darf jeder sich mit dem Connection Manager verbinden und wird je nach tnsnames Eintrag einfach weitergeleitet.
Access Rules einstellen
Nach folgenden Muster können die Regeln eingestellt werden:
(RULE_LIST= (RULE= (SRC=host) (DST=host) (SRV=service_name) (ACT={accept|reject|drop}) (ACTION_LIST=AUT={on|off} ((CONN_STATS={yes|no})(MCT=time)(MIT=time)(MOCT=time))) (RULE= ...))
Parameter | Beschreibung |
---|---|
SRC | Quelle, kann als IP Subnet mit / Notation angegeben werden wie 192.168.178.0/24 (siehe zum Beispiel für die CIDR-Suffix den Heise online Rechner |
DST | Ziel, angabe wie Quelle |
SRV | Oracle Service Name |
ACT | accept, reject, oder drop der Verbindung |
ACTION_LIST: The rule-level parameter settings for some parameters.
Parameter:
- AUT: Oracle Database security authentication on client side.
- CONN_STATS: Log input and output statistics.
- MCT: Maximum connect time.
- MIT: Maximum idle timeout.
- MOCT: Maximum outbound connect time.
siehe auch http://docs.oracle.com/cd/E16655_01/network.121/e17611/cman.htm#NETRF337
Wenn die Default Rule angepasst wird, muss die lokale Regel für den Connection des cmctl auf den Connction Manager hinterlegt werden
(rule_list= (rule= (src=cman21c.pipperr.local) (dst=127.0.0.1) (srv=cmon) (act=accept) ) )
Beispiel:
(RULE_LIST= (RULE=(SRC=10.10.10.0/8) (DST=10.10.10.1) (SRV=GPI_DATA) (ACT=accept) ) )
Password setzen
Das Password kann nicht direkt in der „cman.ora“ hinterlegt werden, sondern wird im „cmctl“ Utiltiy gesetzt und dann verschlüsselt in der „cman.ora“ gespeichert.
cmctl CMCTL> administer cman_gpi CMCTL:cman_gpi> startup .. TNS-04077: WARNING: No password set for the Oracle Connection Manager instance. .. CMCTL:cman_gpi> set password Enter Old password: Enter New password: Reenter New password: The command completed successfully. CMCTL:cman_gpi> save_passwd The command completed successfully. # Was wird erzeugt cat cman.ora #----ADDED BY CMAN 18-MAY-2015 09:29:34--- password_cman_gpi = 10D34223DA9F8D28 #-
Beim nächsten Anmelden wird nach dem Passwort gefragt
CMAN - eine Umgebung richtig testen
Um das ganze zu optimieren, drei User Oracle Sessions auf dem CMAN Host starten So lassen sich die Regel dann nach und nach härten und es ist schnell klar wenn es nicht so passt wie gewünscht.
Config Session
Hier die Konfig bearbeiten
vi $ORACLE_HOME/network/admin/cman.ora
Log Session
Hier den Log es CMAN im Tail starten
adrci adrci> show homes ADR Homes: diag/netcman/cman21c/cman_gpi diag/tnslsnr/cman21c/listener adrci> set home diag/netcman/cman21c/cman_gpi adrci> show alert -tail -f ... 07-JUN-2022 18:13:24 * service_update * cman * 0 .. usw.
CMAN Session
cmctl CMCTL> administer cman_gpi #Registierung anzeigen show service #Config anzeogen show all show parameters #stop shutdown #start startup
Normalerweise könnten man erwarten das ein „reload“ Befehl genügt um die Konfig neu zu laden, aber nicht immer klappt das auch, besser stoppen und dann neu starten.
Client / DB Host Session
Je nach Aufgaben noch eine Session z.B. auf dem DB Host starten:
Von einer Datenbank kann die Registrierung am CMAN anstoßen werden mit:
-- einmal den Parameter setzen ALTER system SET remote_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.96)(PORT = 1999))' scope=memory; -- bei Änderungen am CMAN erneut registieren ALTER system register;
TCPDUMP Session
Treten Probleme wie verzögerter Connect auf, in einer root Session z.B. mit „tcpdump“ den Verbindungsaufbau mit „schneiden“
Als root user:
dnf install tcpdump -- tcpdump -i ens160 -nn -s0 -A -v port 1999
Test Problem mit "ORA-12631: Username retrieval failed"
Ab einer 19x Version ist zu beachten das wenn auf dem Windows DB Host in der sqlnet.ora der Parameter SQLNET.AUTHENTICATION_SERVICES NTS enthält, und von der Maschine über den CMAN wieder ein Connect auf die selbe Maschine durchgeführt wird es zu einem „ORA-12631: Username retrieval failed“ kommt!
Mit der Härtung des SQL*Net Protokolls (19.8 ??) wurde für NTS Autorisierung (Windows Authentifzierung mit / as sysdba über DBA Gruppe) diese Verhalten expliziert eingeführt!
Durch den weiteren SQL*Net Parameter „SQLNET.NO_NTLM=FALSE“ lässt sich diese Sicherheits-Feature wieder auf das alten Verhalten setzen!.
Im einfachsten Fall erstmal den SQLNET.AUTHENTICATION_SERVICES erstmal für den Testcase auskommentieren oder „SQLNET.NO_NTLM=FALSE“ setzen.
Siehe auch den Kerberos Artikel zu dem Thema ⇒ Kerberos für die Authentifizierung eines AD Users in der Oracle DB verwenden - Einsatz der DB Proxy User Architektur
Problem - Langsamer Verbindungaufbau zur Zieldatenbank
In einer EXADATA Umgebung tritt das folgende Verhalten auf, von selben Client ist der direkte Connect über den Scan Listner der DB Umgebung schnell, beim Zugriff über den CMan mit dem selben User auf den gleichen Service / Scan Listener ist der Zugriff um ca. 10s verzögert.
Da hier immer die 10s auftauchen, ist der Verdacht das eine Namesaufläsung hier nicht so will wie es soll, siehe Support Node dazu , „Sqlnet Connection via TCP Hangs For About 10 Seconds Before Connection is Established(1071330.1)“
Test Connect Zeit mit
time echo exit | sqlplus gpi/xxxx@gpi_db_cman
Um das Problem einzugrenzen auf dem CMAN Server und dem Client das SQLNET Tracing aktiveren und das DNS Protokoll mit Tcpdump parallel auf dem Client und den CMAN beobachten.
Test auf CMan ob hier DNS Abfragen parallel beim Aufruf des Connects erfolgen. als root mit:
tcpdump -i ens160 -nn -s0 -A -v port 53
Eine Ursache - FAN Listener Verhalten
Nach dem Deaktivieren des FAN Listener Feature für SQL*Plus auf dem Klient, verbessert sich das Verhalten
Datei /opt/oracle/product/21c/client_1/network/admin/oraaccess.xml erstellen:
<?xml version="1.0" encoding="ASCII" ?> <oraaccess xmlns=http://xmlns.oracle.com/oci/oraaccess xmlns:oci=http://xmlns.oracle.com/oci/oraaccess schemaLocation="http://xmlns.oracle.com/oci/oraaccess http://xmlns.oracle.com/oci/oraaccess.xsd"> <default_parameters> <events>false</events> </default_parameters> </oraaccess>
Siehe dazu ⇒ Disable FAN events Doc ID 2179568.1
Registierung auf dem ONS auf dem RAC Server prüfen mit: User grid
# Debug ausgabe nur auf die Client Anmeldungen begrenzen onsctl debug comp=ons[client]
Zu ONS siehe: Support:
- The ONS Daemon Explained In Oracle Clusterware/RAC Environment (Doc ID 759895.1)
Web:
SQL*Net Verschlüsselung
Die Parametrisierung der symmetrischen SQL*Net Protokol Verschlüsselung ( siehe ⇒ Das SQL*Net Protokoll mit einer symmetrischen Verschlüsselung wie DES / AES oder RC4 schützen findet nur auf dem Client und auf dem Server statt!
Auf dem CMAN muss dazu nichts konfiguriert werden!
siehe auch Dokument ⇒ „ORA-12564 when using native encryption settings in sqlnet.ora on CMAN server (Doc ID 1538702.1)“
Weitere Härtungsmaßnahmen für die DB Umgebung
Auf dem DB Host den Listener einschränken
Nur noch die Verbindung an den Datenbank Listener über den Connection Manager zulassen:
sqlnet.ora des Oracle DB Listeners anpassen:
#Prüfung aktivieren TCP.VALIDNODE_CHECKING=YES #Nur noch diese Liste von Hosts zulassen TCP.INVITED_NODES=(10.10.10.96)
–
Probleme
TNS-04012: Unable to start Oracle Connection Manager instance
CMCTL:cman1> startup
TNS-04012: Unable to start Oracle Connection Manager instance.
Der TNS-04012 sagt leider wenig aus, in meine Fall war die cman.ora fehlerhaft!
Oracle Support:
- 733421.1 Troubleshooting Guide: TNS-04012: Unable to Start Oracle Connection Manager Instance
Fehler **TNS-04011: Oracle Connection Manager instance not yet started.**
Nach dem Start des Connection Manager kann mit cmctl die Verwaltung nicht mehr durchgeführt werden.
Fehler:
CMCTL> administer cman_gpi Current instance cman_pb is not yet started Connections refer to (address=(protocol=tcp)(host=oradb12c01.pipperr.local)(port=1999)). The command completed successfully. CMCTL:cman_pb> show all TNS-04011: Oracle Connection Manager instance not yet started.
Lösung:
In meiner Umgebung war die Rule bzgl. Connect auf sich selbst fehlerhaft. Wird mit Rules gearbeitet, muss eine Regel aufgenommen werden, das der locale Client mit dem Connection Manager Admin Prozess kommunizieren darf.
Regel:
(rule=(src=cman21c.pipperr.local)(dst=127.0.0.1)(srv=cmon)(act=accept)) (rule=(src=cman21c.pipperr.local)(dst=*)(srv=cmon)(act=accept))
??Warum reicht nicht nur die localhost rule?? Sehr seltsam …..
Statisches Routing von Client Anfragen
Wenn der Client nur über einen Service anfragen kann kann auch ein statisches Routing definiert werden.
Dazu stehen die Parameter USE_SID_AS_SERVICE und USE_SERVICE_AS_TNSNAMES_ALIAS zur Verfügung.
Das ist besonders in unseren Standby DB Scenario jetzt sehr hilfreich.
Auf dem CMan Host
In der cman.ora:
Parameter:
.. (USE_SERVICE_AS_TNSNAMES_ALIAS=ON) (USE_SID_AS_SERVICE=ON) ..
in der tnsnames.ora
SRV_IMPORT= (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.1)(port=1521)) (CONNECT_DATA= (SERVICE_NAMES=SRV_IMPORT) ) )
!DESCRIPTION_LIST is not supported in the tnsnames.ora file of CMAN home!
Alternativ für eine Standby Umgebung, Adressliste angeben mit alternativen Listenern der Standby Umgebungen:
SRV_IMPORT= (DESCRIPTION= (FAILOVER=on) (CONNECT_TIMEOUT=1) (RETRY_COUNT=3) (ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.1)(port=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.190)(port=1521)) (CONNECT_DATA= (SERVICE_NAME=SRV_IMPORT) ) )
Das funktioniert aber nur mit den obigen Connect Timeout und Retry Count Parametern! Bei höheren Timeouts erfolgt ein „ORA-12537: TNS:connection closed“ bis der CMAN den richtigen Listener gefunden hat!
Auf dem Client Host
in der tnsnames.ora
CMAN_GPI_ROUTING = (DESCRIPTION = (ADDRESS = (CONNECT_TIMEOUT=1) (RETRY_COUNT=3) (PROTOCOL = TCP)(HOST = 10.10.10.96)(PORT = 1999)) (CONNECT_DATA = (SERVICE_NAME = SRV_IMPORT) ) ) CMAN_GPI_ROUTING_SID = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.96)(PORT = 1999)) (CONNECT_DATA = (SID = SRV_IMPORT) ) )
Das funktioniert auch mit der JDBC Syntax "host:port//service" bzw „host:port:SID“, das heißt so können auch Java Clients umgeleitet werden die keine TNSNAMES.ora „vertragen“.
Datenbank am Connection Manager als Service anmelden
Über den Remote Listener Parameter kann eine Datenbank sich auch an einem entfernten Listener registrieren.
Diese Feature konnte in der Vergangenheit auch missbraucht werden und ist daher per Default deaktiviert ( cman Parameter (VALID_NODE_CHECKING_REGISTRATION=ON | OFF)!
Um es ohne jede weiter Prüfung wieder zu aktiveren muss der Parameter auf ON stehen.
Problem: Listener(VNCR option 1) rejected Registration request from destination
adrci> show alert .. 2: diag/netcman/cman21c/cman_gpi .. Please select option: 2 Listener(VNCR option 1) rejected Registration request from destination 10.10.10.1 07-JUN-2022 17:50:28 * service_register_NSGR * 1182
Hier fehlt uns noch eine Berechtigung wie VALID_NODE_CHECKING_REGISTRATION=ON um die Registrierung zu erlauben.
Damit aber der CMAN nicht wieder missbräuchlich verwendet wird, sollte die IP Adresse eingeschränkt werden mit dem Parameter ( REGISTRATION_INVITED_NODES = 10.10.10.*) nur auf die DB's die es auch dürfen sollen, mit ( REGISTRATION_EXCLUDED_NODES = 192.*) auf die Hosts die ausgeschlossen werden sollen.
Siehe auch:
- Valid Node Checking for Registration parameter in Connection Manager ( VNCR in CMAN ) (Doc ID 2259948.1)
Remote Listener in Singe Target Database
In der Single Target DB anmelden und Remote Listener testweise setzen
ALTER system SET remote_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.96)(PORT = 1999))' scope=memory; -- neu anmelden mit: ALTER system register;
Wenn es funktioniert mit scope=both aus persistent setzen!
Remote Listener in Custer Target Database
In einer Oracle RAC Cluster Konfiguration mit Scan Listener muss ein TNS Eintrag für den Remote Listener Parameter erstellt werden, in dem alle Scan Listener IP Adressen UND der Oracle Connection Manager aufgeführt ist.
Siehe auch Doc ID 1375897.1
SELECT TYPE, VALUE FROM v$listener_network WHERE TYPE='REMOTE LISTENER'; TYPE ---------------------------------------------------------------- VALUE ---------------------------------------------------------------------------------------------------------------------------------- REMOTE LISTENER (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.200)(PORT=1521))) REMOTE LISTENER (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.210)(PORT=1521))) REMOTE LISTENER (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.220)(PORT=1521))) SYS@GPIDB1-racdb01>SHOW parameter remote_listener NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_listener string rac01cluster.pipperr.local:152 1 -- umstellen auf TNS Alias!
REMOTE_LIST = (DESCRIPTION = (ADDRESS_LIST= (ADDRESS=(PROTOCOL = TCP)(HOST = 10.10.10.220)(PORT = 1521)) (ADDRESS=(PROTOCOL = TCP)(HOST = 10.10.10.210)(PORT = 1521)) (ADDRESS=(PROTOCOL = TCP)(HOST = 10.10.10.200)(PORT = 1521)) (ADDRESS=(PROTOCOL = TCP)(HOST = 10.10.10.96 )(PORT = 1999)) ) )
ALTER system SET remote_listener=REMOTE_LIST scope=memory sid='*'; SYS@GPIDB1-racdb01>SELECT TYPE, VALUE FROM v$listener_network WHERE TYPE='REMOTE LISTENER'; TYPE ---------------------------------------------------------------- VALUE ---------------------------------------------------------------------------------------------------------------------------------- REMOTE LISTENER (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.200)(PORT=1521))) REMOTE LISTENER (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.210)(PORT=1521))) REMOTE LISTENER (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.220)(PORT=1521))) REMOTE LISTENER (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.96)(PORT=1999)))
Im Cman Log:
2022-06-07 22:37:47.888000 +02:00 Dynamic address is already listened on (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=cman21c.pipperr.local)(PORT=1999))) 07-JUN-2022 22:37:47 * (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.190)(PORT=31363)) * service_register * GPIDB1 * 0 Dynamic address is already listened on (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=cman21c.pipperr.local)(PORT=1999))) 07-JUN-2022 22:37:47 * (ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.194)(PORT=15514)) * service_register * GPIDB2 * 0
TNS Eintrag auf dem Client
! der zu der DB Maschine sich verbinden soll !
cman_gpi_db= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST=cman21c.pipperr.local)(PORT = 1999) ) (CONNECT_DATA = (SERVICE_NAME=GPI) ) )
Test mit tnsping und sqlplus.
Wie einzelne Services steuern?
Siehe dazu auch:
- Force Connections to a Specific Database Service When two Identical Services are Registered to CMAN (Doc ID 1455068.1) - wird über eine Rule abgewickelt
Sicherheitshinweise
Mitschneiden über den CMAN
TestCase:
- Auf CMAN Host für den 1999 Port das Mitschneiden des SQL*Net Protokolls einschalten
tcpdump -i ens160 -nn -s0 -A -v port 1999
- Auf dem Client PC mit SQL*Plus an der DB Anmelden und z.B. ein Passwort ändern
ALTER USER xxxx IDENTIFIED BY hugo;
- Im Trace nach dem „alter user“ suchen
.. 10:58:02.471303 IP (tos 0x0, ttl 128, id 9835, offset 0, flags [DF], proto TCP (6), length 439) 10.10.10.1.63187 > 10.10.10.96.1999: Flags [P.], cksum 0x30d3 (correct), seq 3852:4251, ack 2441, win 4104, length 399 E...&k@....a ................."alter user xxxx identified by hugo......... 10:58:02.477553 IP (tos 0x0, ttl 64, id 12805, offset 0, flags [DF], proto TCP (6), length 51) ..
Und siehe das da ist auch das Passwort!
Auto Start als Linux Service einrichten
Start/Stop Skripte erstellen
Als User „oracle“ folgende Datei in /opt/oracle/scripts/start_connection_manager.sh anlegen.
- start_connection_manager.sh
#!/bin/bash # ORACLE_USER=oracle ORACLE_HOME=/opt/oracle/product/21c/client_1 ORACLE_CMAN_NAME=cman_gpi_db #Start or stop the Oracle CMan Node case "$1" in start) # Oracle Connection Manager start echo -n "Starting Oracle Connection Manager: " export ORACLE_HOME=$ORACLE_HOME; $ORACLE_HOME/bin/cmctl << EOScipt administer ${ORACLE_CMAN_NAME} startup exit EOScipt echo "OK" ;; stop) # Oracle Oracle Connection Manager shutdown echo -n "Shutdown Oracle Connection Manager: " export ORACLE_HOME=$ORACLE_HOME; $ORACLE_HOME/bin/cmctl << EOScipt administer ${ORACLE_CMAN_NAME} shutdown exit EOScipt echo "OK" ;; status) # status echo -n "Status Oracle Connection Manager: " export ORACLE_HOME=$ORACLE_HOME; $ORACLE_HOME/bin/cmctl << EOScipt administer ${ORACLE_CMAN_NAME} show all exit EOScipt ;; reload|restart) $0 stop $0 start ;; *) echo "Usage: $0 start|stop|restart|reload|status" exit 1 esac exit 0
Start/stop Scripts anlegen als user oracle
vi /opt/oracle/scripts/startcman.sh #!/bin/sh /opt/oracle/scripts/start_connection_manager.sh start >> /opt/oracle/scripts/startup.log 2>&1 vi /opt/oracle/scripts/stopcman.sh #!/bin/sh /opt/oracle/scripts/start_connection_manager.sh stop >> /opt/oracle/scripts/shutdown.log 2>&1 chmod 777 stopcman.sh chmod 777 startcman.sh chmod 777 start_connection_manager.sh #Scripte als oracle User testen!
Service anlegen
User root
Datei “/lib/systemd/system/cman.service„ anlegen:
[Unit] Description=The Oracle CMAN Service After=syslog.target network.target [Service] Type=simple RemainAfterExit=yes User=oracle Group=oinstall ExecStart=/opt/oracle/scripts/startcman.sh ExecStop=/opt/oracle/scripts/stopcman.sh [Install] WantedBy=multi-user.target
Link anlegen:
ln -s /lib/systemd/system/cman.service /etc/systemd/system/cman.service
Reload systemd
systemctl daemon-reload
Starten und einschalten des Service:
#Starten systemctl start cman.service #Auto Start aktivieren systemctl enable cman.service #Status prüfen systemctl status cman.service -l #Stoppen systemctl stop cman.service #prüfen ob die Start Reichenfolge auch passt: systemd-analyze critical-chain cman.service
Quellen
Oracle
Support
- A Guide to CMAN Configuration for 10g and Newer Releases (Doc ID 298916.1)
- Integrating Connection Manager (CMAN) into a RAC+SCAN Environment (Doc ID 1556300.1)
- ORA-12564 when using native encryption settings in sqlnet.ora on CMAN server (Doc ID 1538702.1)
- ORA-12631 While Connecting To The Database (Doc ID 986865.1)
- How to configure Connection Manager (CMAN) with Transparent Application Failover (TAF)? (Doc ID 397021.1)
- Troubleshooting Connection Manager (CMAN) (Doc ID 579660.1)
Overview
CMAN Parameter