Oracle 21c: „Open – and more“- Neue Automatismen rund um die PDBs
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: