Von einer RAC-Datenbank zu RAC One Node
RAC One Node ist eine Single-Instance-Datenbank im Cluster, die beim einem Wechsel auf einen anderen Cluster-Knoten kurzzeitig zu einer RAC-Datenbank wird, damit ein unterbrechungsfreier Wechsel möglich ist. Und im Fehlerfall wechselt die Datenbank automatisch auf den 2.Server. Manchmal kann es sinnvoll sein, eine RAC-Datenbank zu einer RAC-One-Node-Datenbank zu machen. Aber wie macht man das?
Die Gründe für einen derartigen Wechsel sind vielfältig:
- Man möchte Lizenzkosten sparen. RAC One Node ist zwar auch eine kostenpflichtige Option der Enterprise Edition, aber günstiger als RAC.
- Die Anwendung skaliert nicht auf einem RAC. Das kann sogar dazu führen, dass sie auf einem Single-Instance-System schneller ist als im RAC.
Wie funktioniert ein derartiger Wechsel?
Die Ausgangssituation in unserem Testsystem (Oracle Linux 8.10):
Der Cluster besteht aus 2 Knoten:
[oracle@statler ~]$ olsnodes -c
muppetshow
[oracle@statler ~]$ olsnodes
statler
waldorf
Grid Infrastructure:
[grid@statler ~]$ $ORACLE_HOME/OPatch/opatch lspatches
36460248;TOMCAT RELEASE UPDATE 19.0.0.0.0 (36460248)
36383196;DBWLM RELEASE UPDATE 19.0.0.0.0 (36383196)
36240578;OCW RELEASE UPDATE 19.23.0.0.0 (36240578)
36233343;ACFS RELEASE UPDATE 19.23.0.0.0 (36233343)
36233263;Database Release Update : 19.23.0.0.240416 (36233263)
OPatch succeeded.
Die RDBMS-Software:
[oracle@statler ~]$ $ORACLE_HOME/OPatch/opatch lspatches
36240578;OCW RELEASE UPDATE 19.23.0.0.0 (36240578)
36420641;DATAPUMP BUNDLE PATCH 19.23.0.0.0
36195566;JDK BUNDLE PATCH 19.0.0.0.240416
36199232;OJVM RELEASE UPDATE: 19.23.0.0.240416 (36199232)
36233263;Database Release Update : 19.23.0.0.240416 (36233263)
OPatch succeeded.
Die Datenbank:
[oracle@statler ~]$ srvctl config database -db DEMOCDB
Database unique name: DEMOCDB
Database name: DEMOCDB
Oracle home: /u00/app/oracle/product/19.23
Oracle user: oracle
Spfile: +DATA/DEMOCDB/PARAMETERFILE/spfile.272.1174345591
Password file: +DATA/DEMOCDB/PASSWORD/pwddemocdb.256.1174338673
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,FRA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: DEMOCDB1,DEMOCDB2
Configured nodes: statler,waldorf
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
In der CDB gibt es eine PDB namens DEMOPDB und für diese PDB gibt es einen Dienst DEMOSVC:
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 DEMOPDB READ WRITE NO
[oracle@statler ~]$ srvctl status service -db DEMOCDB -service DEMOSVC
Service DEMOSVC is running on instance(s) DEMOCDB1,DEMOCDB2
[oracle@statler ~]$ srvctl config service -db DEMOCDB -service DEMOSVC
Service name: DEMOSVC
Server pool:
Cardinality: 2
Service role: PRIMARY
Management policy: AUTOMATIC
DTP transaction: false
AQ HA notifications: false
Global: false
Commit Outcome: false
Failover type:
Failover method:
Failover retries:
Failover delay:
Failover restore: NONE
Connection Load Balancing Goal: LONG
Runtime Load Balancing Goal: NONE
TAF policy specification: NONE
Edition:
Pluggable database name: DEMOPDB
Hub service:
Maximum lag time: ANY
SQL Translation Profile:
Retention: 86400 seconds
Replay Initiation Time: 300 seconds
Drain timeout:
Stop option:
Session State Consistency: DYNAMIC
GSM Flags: 0
Service is enabled
Preferred instances: DEMOCDB1,DEMOCDB2
Available instances:
CSS critical: no
Service uses Java: false
Konvertierung einer (administrator-managed) RAC-Datenbank in eine RAC-One-Node-Datenbank:
Variante 1: „srvctl convert database“
Der Befehl „srvctl convert database“ schlägt beim ersten Versuch fehl:
[oracle@statler ~]$ srvctl convert database -db DEMOCDB -dbtype RACONENODE -instance DEMOCDB -timeout 60
PRCD-1214 : Administrator-managed RAC database DEMOCDB has more than one instance
Also entfernen wir eine Instanz
[oracle@statler ~]$ srvctl stop instance -db DEMOCDB -instance DEMOCDB2
[oracle@statler ~]$ srvctl remove instance -db DEMOCDB -instance DEMOCDB2
Remove instance from the database DEMOCDB? (y/[n]) y
Danach funktioniert „srvctl convert database“ problemlos:
[oracle@statler ~]$ srvctl convert database -db DEMOCDB -dbtype RACONENODE -instance DEMOCDB -timeout 60
oracle@statler ~]$ srvctl config database -db DEMOCDB
Database unique name: DEMOCDB
Database name:
Oracle home: /u00/app/oracle/product/19.23
Oracle user: oracle
Spfile: +DATA/DEMOCDB/PARAMETERFILE/spfile.272.1174345591
Password file: +DATA/DEMOCDB/PASSWORD/pwddemocdb.256.1174338673
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,FRA
Mount point paths:
Services: DEMOSVC
Type: RACOneNode
Online relocation timeout: 60
Instance name prefix: DEMOCDB
Candidate servers: statler
OSDBA group: dba
OSOPER group: oper
Database instances: DEMOCDB_1
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
„timeout“ = max. Zeit für den „Umzug“ der Instanz (in Minuten), Default: 30 Minuten
Test:
[oracle@statler ~]$ srvctl status database -db DEMOCDB
Instance DEMOCDB1 is running on node statler
Online relocation: INACTIVE
[oracle@statler ~]$ srvctl relocate database -db DEMOCDB -node waldorf -verbose
Added target node waldorf
Configuration updated to two instances
Instance DEMOCDB_2 started
Services relocated
Waiting for up to 60 minutes for instance DEMOCDB1 to stop ...
Instance DEMOCDB1 stopped
Configuration updated to one instance
[oracle@statler ~]$ srvctl status database -db DEMOCDB
Instance DEMOCDB_2 is running on node waldorf
Online relocation: INACTIVE
Wenn es keinen Applikationsservice gibt, der der Datenbank (bzw. in diesem Fall genauer gesagt, der PDB) zugeordnet ist, dann funktioniert „srvctl convert database“ nicht. Es kommt die Fehlermeldung:
PRCD-1242 : Unable to convert RAC database DEMOCDB to RAC One Node database because the database had no service added
Hintergrund ist, dass beim „relocate“ zuerst die 2.Instanz gestartet wird und dann der Applikations-Service auf die 2.Instanz verschoben wird. Neue Anmeldungen gehen dann auf die 2.Instanz und die 1.Instanz läuft dann langsam leer. Das heißt auch, dass Verbindungen an die Datenbank bei einer RAC One Node-Konfiguration immer über den Applikations-Service erfolgen sollten. Beim Relocate kann die maximale Dauer des „Leerlaufens“ über den parameter „-drain_timeout“ (in Sekunden) angegeben werden.
Variante 2 – ohne „srvctl convert database“
Man kann das, was srvctl convert macht, auch manuell machen (ist allerdings mehr Aufwand):
Schritt 1: Instanz-spezfische Parameter löschen
Bei einer RAC-One-Node-DB heißen die Instanzen nicht DEMOCDB1 und DEMOCDB2, sondern DEMOCDB_1 bzw. DEMOCDB_2. Zur Vorbereitung auf die Änderung sichern wir daher das spfile und löschen die Instanz-spezifischen Einträge:
SQL> create pfile='/home/oracle/initDEMOCDB.ora' from spfile;
File created.
SQL> alter system reset instance_number sid='DEMOCDB1';
System altered.
SQL> alter system reset instance_number sid='DEMOCDB2';
System altered.
SQL> alter system reset thread sid='DEMOCDB1';
System altered.
SQL> alter system reset thread sid='DEMOCDB2';
System altered.
SQL> alter system reset undo_tablespace sid='*';
System altered.
SQL> alter system reset undo_tablespace sid='DEMOCDB1';
System altered.
SQL> alter system reset undo_tablespace sid='DEMOCDB2';
System altered.
Datenbank stoppen
Dann stoppen wir die Datenbank, denn die Ressource können wir nicht entfernen, wenn die Datenbank läuft:
[oracle@statler ~]$ srvctl stop database -db DEMOCDB
Schritt 2: Datenbank-Resourcen entfernen
(Keine Sorge, dieser Befehl entfernt nur die Cluster-Resource der Datenbank, nicht die Datenbank selbst)
[oracle@statler ~]$ srvctl remove database -db DEMOCDB
Remove the database DEMOCDB? (y/[n]) y
Schritt 3: Datenbank als RAC-One-Node-Datenbank wieder anlegen
[oracle@statler ~]$ srvctl add database -db DEMOCDB \
> -oraclehome $ORACLE_HOME \
> -dbtype RACONENODE \
> -instance DEMOCDB \
> -timeout 60 \
> -diskgroup "DATA,FRA" \
> -server "statler,waldorf" \
> -spfile +DATA/DEMOCDB/PARAMETERFILE/spfile.272.1174345591 \
> -pwfile +DATA/DEMOCDB/PASSWORD/pwddemocdb.256.1174338673
Schritt 4: Datenbank-Service für die PDB wieder anlegen
[oracle@statler ~]$ srvctl add service -db DEMOCDB -pdb DEMOPDB -service DEMOSVC
Schritt 5: Datenbank wieder starten
[oracle@statler ~]$ srvctl start database -db DEMOCDB
[oracle@statler ~]$ srvctl status database -db DEMOCDB
Instance DEMOCDB_1 is running on node statler
Online relocation: INACTIVE
Schritt 6: Kontrolle
[oracle@statler ~]$ srvctl status database -db DEMOCDB
Instance DEMOCDB_1 is running on node statler
Online relocation: INACTIVE
[oracle@statler ~]$ srvctl status service -db DEMOCDB
Service demosvc is running on instance(s) DEMOCDB_1
Man sieht, dass Oracle den Instanznamen automatisch vergeben hat – es ist jetzt „DEMOCDB_1“.
Schritt 7: Test des „Relocate“
[oracle@statler ~]$ srvctl relocate database -db DEMOCDB -node waldorf
[oracle@statler ~]$ srvctl status database -db DEMOCDB
Instance DEMOCDB_2 is running on node waldorf
Online relocation: INACTIVE
[oracle@statler ~]$ srvctl status service -db DEMOCDB
Service demosvc is running on instance(s) DEMOCDB_2
Zusammenfassung:
Eine Konvertierung einer RAC-Datenbank in eine RAC-Datenbank ist mit wenigen Schritten schnell und einfach möglich. „srvctl convert database“ macht alles automatisch, man muss nur vorher eine RAC-Instanz stoppen und aus der Cluster-Konfiguration entfernen.
Anmerkung: ich habe den ursprünglichen Beitrag um „srvctl convert database“ ergänzt.
Dokumentation: