MAX_STRING_SIZE und Remote Cloning einer Non-CDB

7. Juli 2024 0 Von Markus Flechtner

Die maximale Länge einer VARCHAR2-Spalte ist standardmäßig auf 4000 Byte begrenzt. Mit der Einstellung “MAX_STRING_SIZE=EXTENDED” kann man dieses Limit auf 32767 Bytes erhöhen. Aber kann man eine Non-CDB mit derart “verlängerten” VARCHAR2-Spalten in eine CDB mit Standard-Einstellung kopieren? Kommt es dabei zu Problemen? Was ist dabei zu beachten?

Über die Einstellung MAX_STRING_SIZE habe ich schon an anderer Stelle in diesem Blog geschrieben:

Für meinen aktuellen Test habe ich zwei Datenbanken angelegt:

  • NCDBEXT – eine Non-CDB mit MAX_STRING_SIZE=EXTENDED
  • CDB1923 – eine CDB mit MAX_STRING_SIZE=STANDARD

Beide haben den Versionsstand Oracle Database 19c – 19.23 (RU April 2024):

oracle@kiwi:~/ $ORACLE_HOME/OPatch/opatch lspatches
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)
29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)

OPatch succeeded.

Vorbereitungen:

Einstellungen der Non-CDB:

oracle@kiwi:~/ [NCDBEXT] sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jul 6 12:32:20 2024
Version 19.23.0.0.0
Copyright (c) 1982, 2023, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0

SQL> select cdb from v$database;
CDB
---
NO

SQL> show parameter max_string_size
NAME				     TYPE	 VALUE
------------------------------- ----------- ------------------------------
max_string_size 		     string	 EXTENDED

Damit wir gleich ein “remote-cloning” machen können, müssen wir das “CREATE PLUGGABLE DATABASE”-Recht in der Non-CDB vergeben:

SQL> grant create pluggable database to system;
Grant succeeded.

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0

Und jetzt noch ein Blick auf die CDB:

oracle@kiwi:~/ [CDB1923] sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jul 6 12:32:55 2024
Version 19.23.0.0.0

Copyright (c) 1982, 2023, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0

SQL> select cdb from v$database;
CDB
---
YES

SQL> show parameter max_string_size
NAME				     TYPE	 VALUE
------------------------------ ----------- ------------------------------
max_string_size 		     string	 STANDARD

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0

Clonen der Non-CDB

Schritt 1: Datenbank-Link anlegen und testen

SQL> create database link NCDBEXT 
  2  connect to system identified by manager 
  3  using 'localhost:1521/NCDBEXT';
Database link created.

SQL> select * from dual@ncdbext;
D
-
X

Schritt 2: Non-CDB mittels Remote-Cloning zur PDB machen

SQL> create pluggable database PDBEXT from NON$CDB@ncdbext 
  2  file_name_convert=
  3  ('/u01/oradata/NCDBEXT','/u01/oradata/CDB1923/PDBEXT');
Pluggable database created.

Bis jetzt ist noch nicht viel passiert, denn das Remote-Cloning kopiert nur die Datenbank-Dateien der Non-CDB.

Schritt 3: Ergebnis kontrollieren

SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 PDBEXT			  MOUNTED

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



SQL> show con_name
CON_NAME
------------------------------
PDBEXT

SQL> show parameter max_string_size;
NAME				     TYPE	 VALUE
------------------------------- ----------- ------------------------------
max_string_size 		     string	 STANDARD

Der Parameter ist also aktuell auf “STANDARD” gesetzt. Dabei gilt, dass die Einstellungen auf PDB-Ebene in der Tabelle PDB_SPFILE$-Tabelle gespeichert sind und nicht im SPFILE. Es ist auch nicht verwunderlich, dass die Einstellung noch auf “STANDARD” steht, denn außer dem Kopieren der Datenbank-Dateien ist ja noch nichts passiert

Konvertierung des Data Dictionaries

Der entscheidende Schritt ist jetzt die Konvertierung des Data Dictionaries. Aus dem “vollwertigen” Data Dictionary der Non-CDB muss jetzt ein Dictionary gemacht werden, dass auf die Objekt-Definitionen etc. im Root-Container CDB$ROOT verweist:

SQL> spool /home/oracle/pdbext_noncdb_to_pdb.log
SQL> @?/rdbms/admin/noncdb_to_pdb.sql
[...]
SQL> -- leave the PDB in the same state it was when we started
SQL> BEGIN
  2    execute immediate '&open_sql &restricted_state';
  3  EXCEPTION
  4    WHEN OTHERS THEN
  5    BEGIN
  6      IF (sqlcode <> -900) THEN
  7        RAISE;
  8      END IF;
  9    END;
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL>
SQL> WHENEVER SQLERROR CONTINUE;

SQL> spool off

Die Dictionary-Konvertierung läuft also ohne Probleme durch. Wie ist das Ergebnis?

QL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDBEXT                         MOUNTED

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

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDBEXT                         READ WRITE NO

SQL> show parameter max_string_size

NAME                                 TYPE        VALUE
------------------------------- ----------- ------------------------------
max_string_size                      string      EXTENDED


SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0

Anscheinend hat also das Skript “noncdb_to_pdb.sql” die Einstellung erkannt und die Einstellung auf PDB-Ebene geändert. Allerdings findet sich weder in der alert.log-Datei der CDB-Instanz noch im Log des Konvertierungsskriptes ein Hinweis dazu.

Fazit

In diesem Test war ein Einhängen einer “Extended-Non-CDB” in eine “Standard-CDB” ohne Probleme möglich. Das Konvertierungsskript erkennt den Unterschied und passt die Einstellung der neuen PDB automatisch an.