Oracle 21c: “Open – and more”- Neue Automatismen rund um die PDBs

17. August 2021 Aus Von Markus Flechtner

Mit neuen Datenbank-Version Oracle 21c ist die mit 12c eingeführte Container-Datenbank-Architektur (“Multitenant-Architektur”) bekanntermaßen die einzige verfügbare Architektur. Erfreulicherweise hat Oracle mit 21 einige hilfreiche Automatismen rund um den Upgrade und die Migration von Pluggable Datenbanken eingeführt.

TL; DR: Mit dem Befehl “ALTER PLUGGABLE DATABASE .. OPEN;” wird in Oracle 21c ein eventuell nötiger Upgrade auf 21c oder sogar eine Konvertierung einer Non-CDB in eine PDB automatisch ausgeführt. Oracle nennt das “Replay Upgrade on PDB Open” .

 

Die Testumgebung:

Oracle 19c:

oracle@kiwi:~/ [CDB19C] $ORACLE_HOME/OPatch/opatch lspatches
32545013;Database Release Update : 19.11.0.0.210420 (32545013)
32399816;OJVM RELEASE UPDATE: 19.11.0.0.210420 (32399816)
31732095;UPDATE PERL IN 19C DATABASE ORACLE HOME TO V5.32
29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)

Eine Container-Datenbank (CDB19C mit zwei PDBS:

SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED			  READ ONLY  NO
     3 SAMPLEPDB			  READ WRITE NO
     4 TESTPDB			  READ WRITE NO

sowie eine Non-CDB (NCDB19E).

Und natürlich Oracle 21c mit einer leeren Container-Datenbank (DB21E).

 

Fall 1: Aushängen der 19c-PDB TESTPDB und Einhängen in die 21c-CDB DB21E

SQL> alter pluggable database TESTPDB close immediate;
Pluggable database altered.

SQL> alter pluggable database TESTPDB unplug into '/home/oracle/TESTPDB.xml';
Pluggable database altered.

SQL> exit

Wie auch in den früheren Versionen sollte man vor dem Einhängen einer PDB prüfen, ob das Zielsystem mit der PDB kompatibel ist. Also testen wir in der 21c-Datenbank mit der bekannten Funktion DBMS_PDB.CHECK_COMPATIBILITY:

SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
  2  compatible CONSTANT VARCHAR2(3) := CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/home/oracle/TESTPDB.xml')
  3  WHEN TRUE THEN 'YES'
  4  ELSE 'NO'
  5  END;
  6  BEGIN
  7  DBMS_OUTPUT.PUT_LINE(compatible);
  8  END;
  9  /
NO

PL/SQL procedure successfully completed.

Was sind denn die Probleme, die die PDB inkompatibel zu unserer 21-CDB machen?

SQL> set pagesize 30
SQL> set linesize 120
SQL> column cause format a15
SQL> column message format a45
SQL> select type,cause,message  from pdb_plug_in_violations where status <>'RESOLVED';

TYPE	  CAUSE 	  MESSAGE
--------- --------------- ---------------------------------------------
ERROR	  VSN not match   PDB's version does not match CDB's version: P
              DB's version 19.0.0.0.0. CDB's version 21.0.0
              .0.0.

WARNING   Parameter	  CDB parameter compatible mismatch: Previous '
              19.0.0' Current '21.0.0'

WARNING   Parameter	  CDB parameter pga_aggregate_target mismatch:
              Previous 3000M Current 6000M

ERROR	  SQL Patch	  Interim patch 32399816/24099425 (OJVM RELEASE
               UPDATE: 19.11.0.0.210420 (32399816)): Not in
              stalled in the CDB but installed in the PDB

ERROR	  SQL Patch	  No release updates are installed in the CDB b
              ut '19.11.0.0.0 Release_Update 2104130040' is
               installed in the PDB

Oracle erkennt also, dass die PDB eine alte Version hat.

 

Was passiert, wenn wir diese Meldungen ignorieren und die PDB einfach so einhängen und dann öffnen?

SQL> create pluggable database TESTPDB using '/home/oracle/TESTPDB.xml'
  2  copy
  3  file_name_convert=('CDB19C','DB21E');
Pluggable database created.

SQL> alter pluggable database TESTPDB open;

Nach dem “alter pluggable database open”-Befehl kommt keine Fehlermeldung und der Befehl kommt nicht zurück. Normalerweise ein Grund, um nervös zu werden.

Schauen wir doch mal in einer anderen Session nach, welchen Status die PDB hat:

SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED			  READ ONLY  NO
     3 TESTPDB			  MIGRATE    YES

Der Status “MIGRATE” entspricht dem Status einer Datenbank, die mit “ALTER DATABASE OPEN UPGRADE;” geöffnet wurden.

Gehen wir weiter und schauen in die alert.log-Datei der 21c-Datenbank. Dort finden sich (unter anderem) folgende Einträge:

2021-08-17T17:50:38.999002+02:00
TESTPDB(3):Pluggable database TESTPDB opening in read write
[…]
TESTPDB(3):Successfully created internal service TESTPDB at open
****************************************************************
Post plug operations are now complete.
Pluggable database TESTPDB with pdb id - 3 is now marked as NEW.
[…]
TESTPDB(3):Starting Upgrade on PDB Open
2021-08-17T17:50:41.605948+02:00
TESTPDB(3):alter pluggable database application APP$CDB$CATALOG begin install '19.0.0.0.0' on error capture
TESTPDB(3):ORA-65229 signalled during: alter pluggable database application APP$CDB$CATALOG begin install '19.0.0.0.0' on error capture...
TESTPDB(3):alter pluggable database application APP$CDB$CATALOG end install '19.0.0.0.0'
TESTPDB(3):Completed: alter pluggable database application APP$CDB$CATALOG end install '19.0.0.0.0'
2021-08-17T17:50:42.746320+02:00
TESTPDB(3):alter pluggable database application APP$CDB$CATALOG begin upgrade
  '19.0.0.0.0' to '21.0.0.0.0.partial' on error capture
[…]

“Starting Upgrade on PDB open” – Anscheinend erkennt Oracle 21c, dass die eingehängte PDB eine ältere Version ist (in diesem Fall 19c) und startet einen automatischen Upgrade. Das erklärt auch, warum der “ALTER PLUGGABLE DATABASE”-Befehl nicht sofort zum SQL-Prompt zurückkommt.

 

Aber nach einiger Zeit:

SQL> alter pluggable database TESTPDB open;
Pluggable database altered.

Kein Fehler. Und die PDB ist auch ganz “normal” im Read-Write-Modus geöffnet:

SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED			  READ ONLY  NO
     3 TESTPDB			  READ WRITE NO

Was sagen jetzt die Warnungen und Fehler in der View PDB_PLUG_IN_VIOLATIONS?

SQL> select type,cause,message  from pdb_plug_in_violations 
  2  where status <>'RESOLVED' and con_id=3;

TYPE	  CAUSE 	  MESSAGE
--------- --------------- ---------------------------------------------
WARNING   OPTION	  Database option RAC mismatch: PDB installed v
              ersion 21.0.0.0.0. CDB installed version NULL
              .

Tipp: Wenn in der Abfrage nicht auf die Container-ID der PDB eingeschränkt wird, dann erscheinen auch die Warnungen aus dem vorangegangenen Kompatibilitätscheck (mit Container-ID = 1).

Interessanterweise wurde also beim Upgrade anscheinend die RAC-Option in der PDB installiert, obwohl sie in der Ausgangsdatenbank und in der 21c-CDB fehlt.

SQL> alter session set container=TESTPDB;
Session altered.

SQL> @?/rdbms/admin/utlrp
Session altered.

[...]


SQL> select count(*) from dba_invalid_objects;

  COUNT(*)
----------
     0

SQL> colum status format a10
SQL> column comp_name format a40
SQL> select status,comp_name from dba_registry;

STATUS	   COMP_NAME
---------- ----------------------------------------
VALID	   Oracle Database Catalog Views
VALID	   Oracle Database Packages and Types
OPTION OFF Oracle Real Application Clusters
VALID	   JServer JAVA Virtual Machine
VALID	   Oracle XDK
VALID	   Oracle Database Java Packages
VALID	   OLAP Analytic Workspace
VALID	   Oracle XML Database
VALID	   Oracle Workspace Manager
VALID	   Oracle Text
VALID	   Oracle Multimedia
VALID	   Spatial
VALID	   Oracle Locator
VALID	   Oracle OLAP API

14 rows selected.

In der DBA-Registry auf PDB-Ebene ist die RAC-Option dann komischerweise wieder deaktiviert.

Insgesamt sieht die PDB – trotz der Meldung in PDB_PLUG_IN_VIOLATIONS – voll funktionsfähig aus.

 

Fall 2: Einhängen einer 19c-Non-CDB als PDB

In einem zweiten Test hängen wir eine 19c-Non-CDB in die 21c-CDB ein:

Zuerst öffnen wir die Non-CDB im Read-Only-Modus und erzeugen die XML-Manifest-Datei:

SQL> startup mount;
ORACLE instance started.

Total System Global Area 1.2583E+10 bytes
Fixed Size		   12449432 bytes
Variable Size		 1811939328 bytes
Database Buffers	 1.0737E+10 bytes
Redo Buffers		   21102592 bytes
Database mounted.

SQL> alter database open read only;
Database altered.

SQL>  execute dbms_pdb.describe('/home/oracle/NCDB19E.xml');
PL/SQL procedure successfully completed.

SQL> shutdown immediatE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

Es folgt der Kompatibilitätscheck in der 21c-Datenbank:

SQL> SET SERVEROUTPUT ON;
SQL> DECLARE
  2  compatible CONSTANT VARCHAR2(3) := CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/home/oracle/NCDB19E.xml')
  3  WHEN TRUE THEN 'YES'
  4  ELSE 'NO'
  5  END;
  6  BEGIN
  7  DBMS_OUTPUT.PUT_LINE(compatible);
  8  END;
  9  /
NO

PL/SQL procedure successfully completed.

Auch hier schauen wir uns die Kompatibilitätsprobleme genauer an:

SQL> set pagesize 30
SQL> set linesize 120
SQL> column cause format a15
SQL> column message format a45
SQL> select type,cause,message  from pdb_plug_in_violations where status <>'RESOLVED';

TYPE	  CAUSE 	  MESSAGE
--------- --------------- ---------------------------------------------
WARNING   Non-CDB to PDB  PDB plugged in is a non-CDB, requires noncdb_
              to_pdb.sql be run.

ERROR	  VSN not match   PDB's version does not match CDB's version: P
              DB's version 19.0.0.0.0. CDB's version 21.0.0
              .0.0.

WARNING   Parameter	  CDB parameter compatible mismatch: Previous '
              19.0.0' Current '21.0.0'

ERROR	  SQL Patch	  Interim patch 32399816/24099425 (OJVM RELEASE
               UPDATE: 19.11.0.0.210420 (32399816)): Not in
              stalled in the CDB but installed in the PDB

ERROR	  SQL Patch	  No release updates are installed in the CDB b
              ut '19.11.0.0.0 Release_Update 2104130040' is
               installed in the PDB

OK, die Version passt nicht und die Architektur (Non-CDB) ebenfalls nicht. Aber auch hier ignorieren wir die Meldungen, hängen die PDB ein und öffnen sie anschließend:

SQL> create pluggable database PDBTEST
  2  using '/home/oracle/NCDB19E.xml'
  3  copy
  4  file_name_convert=('NCDB19E','DB21E/PDBTEST');

Pluggable database created.

SQL> alter pluggable database PDBTEST open;

Und nach etwas längerer Zeit kommt auch hier die Rückmeldung:

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED			  READ ONLY  NO
     4 PDBTEST			  READ WRITE NO
     5 EX19CPDB			  READ WRITE NO

SQL> select type,status,cause,message  from pdb_plug_in_violations where status <>'RESOLVED' and con_id=4;

TYPE	  STATUS    CAUSE	    MESSAGE
--------- --------- --------------- ---------------------------------------------
WARNING   PENDING   OPTION	    Database option RAC mismatch: PDB installed v
                    ersion 21.0.0.0.0. CDB installed version NULL
                    .

Also die gleiche Warnung wie beim PDB-Upgrade.

SQL> alter session set container=PDBTEST;
Session altered.

SQL> @?/rdbms/admin/utlrp
Session altered.

SQL> colum status format a10
SQL> column comp_name format a40
SQL> select status,comp_name from dba_registry;

STATUS	   COMP_NAME
---------- ----------------------------------------
VALID	   Oracle Database Catalog Views
VALID	   Oracle Database Packages and Types
OPTION OFF Oracle Real Application Clusters
VALID	   JServer JAVA Virtual Machine
VALID	   Oracle XDK
VALID	   Oracle Database Java Packages
VALID	   OLAP Analytic Workspace
VALID	   Oracle XML Database
VALID	   Oracle Workspace Manager
VALID	   Oracle Text
VALID	   Oracle Multimedia
VALID	   Spatial
VALID	   Oracle Locator
VALID	   Oracle OLAP API

14 rows selected.

Fazit: Der automatische Upgrade bzw. die automatische Migration beim Öffnen erleichtert den Umgang mit den Pluggable Datenbanken. Features von Auto-Upgrade und dbupgrade wie z.B. Parallelität und Wiederaufsetzen fehlen zwar, aber insgesamt ist das Verfahren deutlich einfacher. Vermutlich (!) werden auch eventuell notwendige SQL-Skripte nach der Installation eines Patches automatisch eingespielt. Dies gilt es beim ersten Release Update für 21c zu testen. Interessanterweise findet sich in der 21c-Dokumentation nichts über dieses Verhalten des “ALTER PLUGGABLE DATABASE .. OPEN”-Befehls.

 

Amazon Partner-Link: