Multitenant: Wechsel zu den Extended Datatypes

23. Oktober 2016 Aus Von Markus Flechtner

Mit Oracle 12c hat Oracle die “Extended Data Types” eingeführt. Dadurch kann die maximale Länge für CHAR und VARCHAR2-Spalten in der Datenbank von 4000 Bytes auf 32767 Bytes erhöht werden. Das ist jedoch nicht die StandardInestellung und es bedarf einiger Schritte, um diese Einstellung zu ändern. Insbesondere in einer Multitenant Umgebung.

Wichtig: ein Wechsel zu den Extended Data Types kann nicht rückgängig gemacht werden!

Zwei Schritte sind zu tun:

  1. Der Parameter MAX_STRING_SIZE muss auf “EXTENDED” gesetzt werden
  2. Die Datenbank muss im UGRADE Modus gestartet werden und das Skript  utl32k.sql muss ausgeführt werden.

In einer Multitenant Datenbank muss das Skript utl32k.sql in jeder PDB ausgeführt werden (Es ist auch möglich, den Parameter MAX_STRING_SIZE auf PDB-Ebene (!) auf STANDARD zu setzen, dann arbeitet eine derartige PDB weiterhin mit dem 4000 Byte Limit und alle anderen PDBs (und CDB$ROOT) mit 32767 Bytes).

Beginnen wir mit CDB$ROOT:

oracle@training:~/ [TVD12CDB] sqlplus "/ as sysdba"

SQL*Plus: Release 12.1.0.2.0 Production on Sun Oct 23 20:06:24 2016

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

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show parameter string_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string STANDARD
Change the instance parameter and start the instance in upgrade mode:

SQL> alter system set max_string_size=EXTENDED scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup upgrade;
ORACLE instance started.

Total System Global Area 1258291200 bytes
Fixed Size 2923920 bytes
Variable Size 452985456 bytes
Database Buffers 788529152 bytes
Redo Buffers 13852672 bytes
Database mounted.
Database opened.


Anschließend können wir das Skript utl32k.sql script in der CDB$ROOT laufen lassen:

 

SQL> @?/rdbms/admin/utl32k.sql

Session altered.

DOC>#######################################################################
DOC>#######################################################################
DOC> The following statement will cause an "ORA-01722: invalid number"
DOC> error if the database has not been opened for UPGRADE.
DOC>
DOC> Perform a "SHUTDOWN ABORT" and
DOC> restart using UPGRADE.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

no rows selected

DOC>#######################################################################
DOC>#######################################################################
DOC> The following statement will cause an "ORA-01722: invalid number"
DOC> error if the database does not have compatible >= 12.0.0
DOC>
DOC> Set compatible >= 12.0.0 and retry.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

PL/SQL procedure successfully completed.

Session altered.

0 rows updated.

Commit complete.

System altered.

PL/SQL procedure successfully completed.

Commit complete.

System altered.

Session altered.

PL/SQL procedure successfully completed.

No errors.

Session altered.

PL/SQL procedure successfully completed.

Commit complete.

Package altered.

Package altered.

Danach müssen wir die Instanz beenden und neu starten:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1258291200 bytes
Fixed Size 2923920 bytes
Variable Size 452985456 bytes
Database Buffers 788529152 bytes
Redo Buffers 13852672 bytes
Database mounted.
Database opened.
SQL> show parameter string_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string EXTENDED
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

Der ROOT-Container wäre also erledigt.

Aber wenn wir uns die alert.log-Datei der Instanz anschauen, dann sehen wir, dass es Probleme mit den Pluggable Datenbanken gegeben hat:

Database Characterset for PDB$SEED is AL32UTF8
Pdb PDB$SEED hit error 14696 during open read only (2) and will be closed.
Sun Oct 23 20:09:37 2016
Errors in file /u00/app/oracle/diag/rdbms/tvd12cdb/TVD12CDB/trace/TVD12CDB_ora_5408.trc:
ORA-14696: MAX_STRING_SIZE migration is incomplete for pluggable database PDB$SEED
ALTER SYSTEM: Flushing buffer cache inst=0 container=2 local
Could not open PDB$SEED error=14696
Sun Oct 23 20:09:37 2016
Errors in file /u00/app/oracle/diag/rdbms/tvd12cdb/TVD12CDB/trace/TVD12CDB_ora_5408.trc:
ORA-14696: MAX_STRING_SIZE migration is incomplete for pluggable database PDB$SEED
Sun Oct 23 20:09:37 2016
Database Characterset for CRM03 is AL32UTF8
Sun Oct 23 20:09:37 2016
Database Characterset for CRM02 is AL32UTF8
Sun Oct 23 20:09:37 2016
Database Characterset for CRM01 is AL32UTF8
Pdb CRM01 hit error 14694 during open read write (1) and will be closed.
Sun Oct 23 20:09:38 2016
Errors in file /u00/app/oracle/diag/rdbms/tvd12cdb/TVD12CDB/trace/TVD12CDB_p000_5432.trc:
ORA-14694: database must in UPGRADE mode to begin MAX_STRING_SIZE migration
ALTER SYSTEM: Flushing buffer cache inst=0 container=3 local
Sun Oct 23 20:09:38 2016
Pdb CRM03 hit error 14694 during open read write (1) and will be closed.
Sun Oct 23 20:09:38 2016
Errors in file /u00/app/oracle/diag/rdbms/tvd12cdb/TVD12CDB/trace/TVD12CDB_p002_5436.trc:
ORA-14694: database must in UPGRADE mode to begin MAX_STRING_SIZE migration
ALTER SYSTEM: Flushing buffer cache inst=0 container=5 local
Sun Oct 23 20:09:38 2016
Pdb CRM02 hit error 14694 during open read write (1) and will be closed.
Sun Oct 23 20:09:38 2016

Die Erklärung:

Meine PDBs sind via “ALTER PLUGGABLE DATABASE .. SAVE STATE” so konfiguriert, dass sie beim Hochfahren der Instanz automatisch geöffnet werden. Das klappt jetzt aber nicht, denn das Skript utl32k.sql ist noch nicht in den PDBs gelaufen.

SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED MOUNTED
 3 CRM01 MOUNTED
 4 CRM02 MOUNTED
 5 CRM03 MOUNTED


Wir müssen also das Skript utl32k.sql in jeder PDB laufen lassen.

Bei der PDB$SEED ist das nicht ganz einfach, denn normalerweise kann man diese PDB nicht “READ WRITE” öffnen. Aber es gibt ja den Trick mit “_oracle_script”:

SQL> alter session set "_oracle_script"=true;
Session altered.

SQL> alter pluggable database pdb$seed open upgrade;
Pluggable database altered.

SQL> alter session set container=PDB$SEED;
Session altered.

SQL> @?/rdbms/admin/utl32k

Session altered.

..

SQL> alter session set container=cdb$root;

Session altered.

SQL> alter pluggable database pdb$seed close;

Pluggable database altered.

SQL> alter pluggable database pdb$seed open read only;

Pluggable database altered.

Danach führen wir die gleichen Schritt für die anderen PDBs durch:

SQL> alter pluggable database crm01,crm02,crm03 open upgrade;
Pluggable database altered.

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

SQL> @?/rdbms/admin/utl32k
..

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

SQL> @?/rdbms/admin/utl32k
..

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

SQL> @?/rdbms/admin/utl32k
..


SQL> alter pluggable database crm01,crm02,crm03 close;

Pluggable database altered.

SQL> alter pluggable database crm01,crm02,crm03 open;

Pluggable database altered.

SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED READ ONLY NO
 3 CRM01 READ WRITE NO
 4 CRM02 READ WRITE NO
 5 CRM03 READ WRITE NO

MOS-Notes:

  • Database Won’t Start After Varchar2(32k) Upgrade (Doc ID 1610329.1)
  • How to Increase the Maximum Size of VARCHAR2, NVARCHAR2, and RAW Columns in 12C Database using MAX_STRING_SIZE ? (Doc ID 1570297.1)

Werbung (Amazon-Partner-Link)