Ich verwende den kostenlosen Oracle 23c Docker-Container (siehe hier), um bei der Bereitstellung einer Entwicklungsumgebung zu helfen.
Als Teil der Konfiguration der Umgebung füge ich Skripte und SQL in die /docker-entrypoint-initdb.d/startup
verwendete Konfiguration in meiner Datei docker-compose.yml ein.
Eines dieser Skripte dient zum Festlegen des COMPATIBILITY-Parameters ( ALTER SYSTEM SET COMPATIBLE = '19.0.0' SCOPE=SPFILE;
), was nach dem Festlegen einen Neustart der Datenbank erfordert.
Bei der Installation einer Serverdatenbank würde ich mein SQL ausführen, um die Kompatibilität festzulegen, gefolgt von etwas wie dem Folgenden:
echo -e "shutdown immediate \n startup mount" | sqlplus -s / as sysdba
um die Datenbank neu zu starten.
Wenn ich dies jedoch im Docker-Container mache (ob ich es nun automatisch mache, wie oben beschrieben, oder indem ich manuell eine Verbindung zu SQLPlus im Container herstelle und dieselben Befehle ausführe), kommt der Lister nach dem Neustart der Datenbank mit einer blockierten Verbindung zurück und ich kann keine Verbindung mehr zur Datenbank herstellen.
docker exec -ti app_db_1 lsnrctl status
ergibt folgendes:
LSNRCTL für Linux: Version 23.0.0.0.0 - Developer-Release am 14.09.2023 08:27:40
Copyright (c) 1991, 2023, Oracle. Alle Rechte vorbehalten.
Verbindung wird hergestellt zu (BESCHREIBUNG=(ADRESSE=(PROTOKOLL=IPC)(SCHLÜSSEL=EXTPROC_FOR_FREE))) STATUS des LISTENER ------------------------ Alias LISTENER Version TNSLSNR für Linux: Version 23.0.0.0.0 – Entwickler-Release Startdatum
14.09.2023 08:27:37 Betriebszeit 0 Tage 0 Std. 0 Min. 2 Sek. Ablaufverfolgungsebene aus, Sicherheit ein: Lokale Betriebssystemauthentifizierung, SNMP aus, Standarddienst
KOSTENLOS, Listener-Parameterdatei
/opt/oracle/product/23c/dbhomeFree/network/admin/listener.ora, Listener-Protokolldatei
/opt/oracle/diag/tnslsnr/854ac05c3c0f/listener/alert/log.xml, Zusammenfassung der Listening-Endpunkte …
(BESCHREIBUNG=(ADRESSE=(PROTOCOL=ipc)(SCHLÜSSEL=EXTPROC_FOR_FREE)))
(BESCHREIBUNG=(ADRESSE=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521))), Diensteübersicht … Dienst „FREE“ hat 1 Instanz(en). Instanz „FREE“, Status BLOCKIERT, hat 1 Handler für diesen Dienst … Dienst „PLSExtProc“ hat 1 Instanz(en). Instanz „PLSExtProc“, Status UNBEKANNT, hat 1 Handler für diesen Dienst... Der Befehl wurde erfolgreich ausgeführt
Beachten Sie den Instance "FREE", status BLOCKED
Abschnitt der Ausgabe.
Wie kann ich die Datenbank programmgesteuert im Container neu starten, ohne dass dies passiert?
UPDATE - wenn man sich anmeldet und den Neustart interaktiv durchführt, wird folgendes angezeigt:
ORA-00201: Steuerdateiversion 23.0.0.0.0 nicht kompatibel mit ORACLE Version 19.0.0.0.0 ORA-00202: Steuerdatei: „/opt/oracle/oradata/FREE/control01.ctl“
Vor dem Neustart lsnrctl status
wird Folgendes zurückgegeben:
LSNRCTL für Linux: Version 23.0.0.0.0 - Developer-Release am 14.09.2023 08:32:57
Copyright (c) 1991, 2023, Oracle. Alle Rechte vorbehalten.
Verbindung wird hergestellt zu (BESCHREIBUNG=(ADRESSE=(PROTOKOLL=IPC)(SCHLÜSSEL=EXTPROC_FOR_FREE))) STATUS des LISTENER ------------------------ Alias LISTENER Version TNSLSNR für Linux: Version 23.0.0.0.0 – Entwickler-Release Startdatum
14.09.2023 08:32:46 Betriebszeit 0 Tage 0 Std. 0 Min. 10 Sek. Ablaufverfolgungsebene aus, Sicherheit EIN: Lokale Betriebssystemauthentifizierung, SNMP AUS, Standarddienst
KOSTENLOS, Listener-Parameterdatei
/opt/oracle/product/23c/dbhomeFree/network/admin/listener.ora, Listener-Protokolldatei
/opt/oracle/diag/tnslsnr/05cf8b8b6d41/listener/alert/log.xml, Zusammenfassung der Listening-Endpunkte …
(BESCHREIBUNG=(ADRESSE=(PROTOCOL=ipc)(SCHLÜSSEL=EXTPROC_FOR_FREE)))
(BESCHREIBUNG=(ADRESSE=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521))), Dienstübersicht … Dienst „FREE“ hat 1 Instanz(en). Instanz „FREE“, Status BEREIT, hat 1 Handler für diesen Dienst … Dienst „PLSExtProc“ hat 1 Instanz(en). Instanz „PLSExtProc“, Status UNBEKANNT, hat 1 Handler für diesen Dienst... Der Befehl wurde erfolgreich ausgeführt
Antwort1
Sie können den compatibility
Parameter nicht niedriger, sondern nur höher einstellen. Dies führte dazu, dass die Datenbank nicht gestartet wurde und der Listener blockiert wurde.