Von 18c-SE2-RAC nach 19c-SEHA

13. Februar 2022 Aus Von Markus Flechtner

Mit der Version 19c hat Oracle den Real Application Cluster aus der Feature-List der “Standard Edition 2” der Datenbank gestrichen. Bis dahin war SE2-RAC eine günstige Hochverfügbarkeitslösung. Ein knappes Jahr später kam der “Ersatz” auf den Markt: Standard Edition High Availability, kurz: SEHA. Und da für immer mehr ältere Versionen der Datenbank der Support ausläuft oder schon ausgelaufen ist, stellt sich für Administratoren die Frage: Wie komme ich von SE2-RAC zu 19c-SEHA?

Mein Test-System besteht aus einem 2-Knoten-Cluster mit Oracle Grid Infrastructure 19c:

oracle@snoopy:~/ [rdbms18] olsnodes
snoopy
charlybrown

oracle@snoopy:~/ [grinf19] echo $ORACLE_HOME;$ORACLE_HOME/OPatch/opatch lspatches
/u00/app/grid/product/19c
33733953;OCW Interim patch for 33733953
33575402;DBWLM RELEASE UPDATE 19.0.0.0.0 (33575402)
33534448;ACFS RELEASE UPDATE 19.14.0.0.0 (33534448)
33515361;Database Release Update : 19.14.0.0.220118 (33515361)
33239955;TOMCAT RELEASE UPDATE 19.0.0.0.0 (33239955)
33192694;OJVM RELEASE UPDATE: 19.13.0.0.211019 (33192694)
OPatch succeeded.

Wer mit zusätzlichen Services in der Datenbank arbeitet, sollte in jedem Fall den Patch 33733953 installieren. Ansonsten werden mit 19.14 Services für ältere Datenbanken, die nicht zu einer PDB gehören, nicht gestartet (Einzelheiten siehe MOS-Note 2835152.1).

Weiterhin habe ich die 18c- und 19c-Standard-Edition 2 installiert:

oracle@snoopy:~/ [rdbms18] echo $ORACLE_HOME;$ORACLE_HOME/OPatch/opatch lspatches
/u00/app/oracle/product/18c-se
32524155;Database Release Update : 18.14.0.0.210420 (32524155)
32552752;OJVM RELEASE UPDATE: 18.14.0.0.210420 (32552752)
28090553;OCW RELEASE UPDATE 18.3.0.0.0 (28090553)
OPatch succeeded.

oracle@snoopy:~/ [rdbms19se] echo $ORACLE_HOME;$ORACLE_HOME/OPatch/opatch lspatches
/u00/app/oracle/product/19c-se
33733953;OCW Interim patch for 33733953
33561310;OJVM RELEASE UPDATE: 19.14.0.0.220118 (33561310)
33515361;Database Release Update : 19.14.0.0.220118 (33515361)
OPatch succeeded.

Wichtig: auch im 19c-RDBMS-Oracle-Home sollte der passende OCW-Patch für die Clusterware, in diesem Fall 33733953, installiert sein.

Auf dem Cluster läuft eine Datenbank SE2DB in der klassischen Architektur (Non-CDB-Architektur):

oracle@snoopy:~/ [SE2DB1] srvctl status database -db SE2DB
Instance SE2DB1 is running on node snoopy
Instance SE2DB2 is running on node charlybrown

oracle@snoopy:~/ [SE2DB1] srvctl config database -db SE2DB
Database unique name: SE2DB
Database name: SE2DB
Oracle home: /u00/app/oracle/product/18c-se
Oracle user: oracle
Spfile: +DATA/SE2DB/PARAMETERFILE/spfile.300.1096408149
Password file: +DATA/SE2DB/PASSWORD/pwdse2db.288.1096406995
Domain: markusdba.local
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,FRA
Mount point paths:
Services: SE2DB_APP
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: SE2DB1,SE2DB2
Configured nodes: snoopy,charlybrown
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed

Für die Datenbank ist ein zusätzlicher Service definiert:

oracle@snoopy:~/ [SE2DB1] srvctl config service  -db SE2DB
Service name: SE2DB_APP
Server pool:
Cardinality: 1
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:
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: SE2DB1
Available instances: SE2DB2
CSS critical: no

 

Wie machen wir aus dieser RAC-Datenbank nun eine SEHA-Datenbank?

Wenn wir davon ausgehen, dass der dbua weiß, dass mit 19c RAC für die SE2 nicht mehr unterstützt ist und dass dbua daher automatisch vorschlägt, aus der RAC-Datenbank eine SEHA-Datenbank zu machen, dann werden wir leider enttäuscht. Denn der 19c-dbua meldet:

Wir müssen die notwendigen Schritte also manuell durchführen:

Schritt 1: pfile generieren

oracle@charlybrown:~/ [SE2DB2] sqlplus / as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Sat Feb 12 22:36:10 2022
Version 18.14.0.0.0
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
Connected to:
Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.14.0.0.0

SQL> create pfile='/home/oracle/initSE2DB.ora' from spfile;
File created.

SQL> exit
Disconnected from Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.14.0.0.0

Schritt 2: pfile bearbeiten

Im pfile werden wir jetzt die notwendigen Daten ändern, wie z.B. CLUSTER_DATABASE auf “FALSE” setzen. Weiterhin empfehle ich, Verweise auf die 2.RAC-Instanz (SE2DB2) zu entfernen und die Einträge für die 1.Instanz (SE2DB1) durch “*” zu ersetzen, denn bei einer Single-Instance-Datenbank ist eine Unterscheidung der Instanzen nicht erforderlich.

Vorher sichern wir natürlich das RAC-spfile:

oracle@charlybrown:~/ [SE2DB2] cp initSE2DB.ora initSE2DB_RAC.ora

Da bei einer Single-Instance-Datenbank die gesamte Last auch von einer Instanz bewältigt werden muss, muss man ggf. auch die Einstellungen für die Speicher-Konfiguration (SGA_MAX_SIZE, SGA_TARGET, PGA_AGGREGATE_TARGET, DB_CACHE_SIZE, SHARED_POOL_SIZE etc.) und weitere Ressourcen (z.B. PROCESSES) entsprechend anpassen.

Auf meinem kleinen Test-System sieht die init.ora-Datei nach der Bearbeitung so aus:

oracle@charlybrown:~/ [SE2DB2] cat initSE2DB.ora
*.audit_file_dest='/u00/app/oracle/admin/SE2DB/adump'
*.audit_trail='db'
*.cluster_database=false
*.compatible='18.0.0'
*.control_files='+DATA/SE2DB/CONTROLFILE/current.289.1096407011','+FRA/SE2DB/CONTROLFILE/current.264.1096407011'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_create_online_log_dest_1='+DATA'
*.db_create_online_log_dest_2='+FRA'
*.db_domain='markusdba.local'
*.db_name='SE2DB'
*.db_recovery_file_dest='+FRA'
*.db_recovery_file_dest_size=7851m
*.diagnostic_dest='/u00/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=SE2DBXDB)'
family:dw_helper.instance_mode='read-only'
*.instance_number=1
*.local_listener='-oraagent-dummy-'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=1200m
*.processes=320
*.remote_login_passwordfile='exclusive'
*.sga_target=3000m
*.thread=1
*.undo_tablespace='UNDOTBS1'

Schritt 3: Datenbank-Konfiguration dokumentieren

Bevor wir die Datenbank stoppen und aus der Cluster-Registry löschen, sollten wir die Konfiguration dokumentieren:

oracle@charlybrown:~/ [SE2DB2] srvctl config service -db SE2DB
oracle@charlybrown:~/ [SE2DB2] srvctl config database -db SE2DB

Schritt 4: Datenbank stoppen

oracle@charlybrown:~/ [SE2DB2] srvctl stop database -db SE2DB

Schritt 5: Datenbank in der Cluster-Registry löschen

oracle@charlybrown:~/ [SE2DB2] srvctl remove database -db SE2DB
Remove the database SE2DB? (y/[n]) y

Schritt 6: Neues spfile anlegen

oracle@charlybrown:~/ [SE2DB2] sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Sat Feb 12 22:49:33 2022
Version 18.14.0.0.0
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
Connected to an idle instance.

SQL> create spfile='+DATA/SE2DB/spfileSE2DB.ora' from pfile='/home/oracle/initSE2DB.ora';
File created.

SQL> exit
Disconnected

Achtung: Die Single-Instance-Datenbank arbeitet somit mit einem anderen SPFILE als die RAC-Datenbank.

Schritt 7: Single-Instance-Datenbank als Cluster-Resource definieren

oracle@charlybrown:~/ [SE2DB2] srvctl add database -db SE2DB -oraclehome $ORACLE_HOME -dbtype SINGLE -instance SE2DB -spfile +DATA/SE2DB/spfileSE2DB.ora -pwfile +DATA/SE2DB/PASSWORD/pwdse2db.288.1096406995 -diskgroup "DATA,FRA" -node charlybrown

Schritt 8: Datenbank starten

oracle@charlybrown:~/ [SE2DB2] srvctl start database -db SE2DB
oracle@charlybrown:~/ [SE2DB2] srvctl status database -db SE2DB
Instance SE2DB is running on node charlybrown

Schritt 9: Service wieder definieren und starten

Wenn es zusätzliche Services gibt, dann können diese Services jetzt wieder angelegt und gestartet werden.

oracle@charlybrown:~/ [SE2DB2] srvctl add service -db SE2DB -service SE2DB_APP
oracle@charlybrown:~/ [SE2DB2] srvctl start service -db SE2DB -service SE2DB_APP
oracle@charlybrown:~/ [SE2DB2] srvctl status service -db SE2DB -service SE2DB_APP
Service SE2DB_APP is running on instance(s) SE2DB

Schritt 10: 2.Redo-Thread deaktivieren

Der Redo-Thread der 2.Instanz wird nicht mehr benötigt und kann deaktiviert werden. Zusätzlich kann man auch die Online-Redolog-Dateien dieses Threads löschen.

oracle@charlybrown:~/ [SE2DB2] export ORACLE_SID=SE2DB
oracle@charlybrown:~/ [SE2DB] sqlplus / as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Sat Feb 12 22:56:52 2022
Version 18.14.0.0.0
Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Connected to:
Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.14.0.0.0

SQL> alter database disable thread 2;
Database altered.

Schritt 11: 2.Undo-Tablespace löschen

Der Undo-Tablespace für die 2.Instanz wird nicht mehr benötigt und kann gelöscht werden:

SQL> drop tablespace UNDOTBS2 including contents and datafiles;
Tablespace dropped.

SQL> exit
Disconnected from Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.14.0.0.0

Schritt 12: Aufräumen

Zum Abschluss der Vorbereitungen ist es eine gute Gelegenheit aufzuräumen und z.B. die Verzeichnisse der RAC-Instanzen im ADR zu löschen:

oracle@charlybrown:/u00/app/oracle/diag/rdbms/se2db/ [SE2DB] ls -ltr
total 8
drwxr-xr-x. 16 oracle asmadmin 4096 Feb 11 21:51 SE2DB2
-rw-r-----.  1 oracle asmadmin    0 Feb 11 21:51 i_1.mif
drwxr-xr-x. 16 oracle asmadmin 4096 Feb 12 22:54 SE2DB
oracle@charlybrown:/u00/app/oracle/diag/rdbms/se2db/ [SE2DB] rm -rf SE2DB2

oracle@charlybrown:/u00/app/oracle/diag/rdbms/se2db/ [SE2DB] ssh snoopy
oracle@snoopy:/u00/app/oracle/diag/rdbms/se2db/ [rdbms19se] rm -rf SE2DB1

Ggf. müssen die RAC-Instanzen auch noch aus anderen Konfigurationsdateien wie z.B. der /etc/oratab gelöscht werden bzw. im Eintrag muss die SID auf “SE2DB” geändert werden.

Neben dem 2.Undo-Tablespace, dem 2.Redolog-Thread und den Dateien im ADR kann man natürlich auch noch das RAC-Spfile im ASM löschen.

Schritt 13: Upgrade auf 19c

Jetzt kann der Upgrade auf die Version 19c erfolgen. Welches Werkzeug man dafür verwendet (dbua (GUI), dbupgrade (CLI) oder autoupgrade) ist in diesem Blog-Post, in dem es ja um den Wechsel von RAC zu SEHA geht, irrelevant.

Ergebnis ist eine 19c-Single-Instance-Datenbank:

oracle@charlybrown:~/ [SE2DB] srvctl status database -db SE2DB
Instance SE2DB is running on node charlybrown
oracle@charlybrown:~/ [SE2DB] srvctl status service -db SE2DB
Service se2db_app is running on instance(s) SE2DB
oracle@charlybrown:~/ [SE2DB] srvctl config database -db SE2DB
Database unique name: SE2DB
Database name:
Oracle home: /u00/app/oracle/product/19c-se
Oracle user: oracle
Spfile: +DATA/SE2DB/spfilese2db.ora
Password file: +DATA/SE2DB/PASSWORD/pwdse2db.288.1096406995
Domain: markusdba.local
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,FRA
Mount point paths:
Services: SE2DB_APP
Type: SINGLE
OSDBA group: dba
OSOPER group: oper
Database instance: SE2DB
Configured nodes: charlybrown
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed

Bitte beachten, dass der Parameter COMPATIBLE beim Upgrade nicht geändert wird:

SQL> show parameter compatible

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
compatible			     string	 18.0.0

Dies muss also nach dem Upgrade manuell gemacht werden.

 

Schritt 14: Konfiguration als SEHA-Datenbank

Die Datenbank wird zu einer SEHA-Datenbank, indem man den zweiten Cluster-Knoten als verfügbaren Knoten hinzufügt.

oracle@charlybrown:~/ [SE2DB] srvctl modify database -db SE2DB -node "charlybrown,snoopy"

Schritt 15: Test des Wechsels auf den anderen Knoten

oracle@charlybrown:~/ [SE2DB] srvctl status database -db SE2DB
Instance SE2DB is running on node charlybrown

oracle@charlybrown:~/ [SE2DB] srvctl relocate database -db SE2DB -node snoopy

oracle@charlybrown:~/ [SE2DB] srvctl status database -db SE2DB
Instance SE2DB is running on node snoopy

oracle@charlybrown:~/ [SE2DB] srvctl relocate database -db SE2DB -node charlybrown

oracle@charlybrown:~/ [SE2DB] srvctl status database -db SE2DB
Instance SE2DB is running on node charlybrown

Damit haben wir aus unserer 18c-RAC-Datenbank eine 19c-SEHA-Datenbank gemacht. Wie oben gesehen, ist ein einfacher “Switchover” zum 2.Server möglich. Beim “Failover” erkennt die Clusterware den Ausfall des Servers und startet die Instanz auf dem 2.Server.

 

Links & weitere Informationen

Amazon-Partner Link