Ziel
Dieser Blogeintrag beschäftigt sich mit einem der neuen 12c Release 1 Features, den erweiterten Datentypen (Extended Data Types). Oracle hat mit dem ersten Release von 12c die maximale Länge der Datentypen VARCHAR2, NVARCHAR2 und RAW auf 32767 Bytes erweitert. Wie man diese konfiguriert, wird in diesem Blogeintrag beschrieben.
Table of Contents
Allgemeines
Interpretation Kommando-Aufruf
Jedem Kommando-Aufruf in diesem Blogeintrag werden folgende Information vorangestellt.
[<Server>: <Benutzer>] ...
Diese beiden Angaben zeigen dem Leser, auf welchem Server und mit welchem Benutzer das Kommando ausgeführt werden muss. Dafür gibt es zusätzlich folgende Ausprägungen.
Ausprägung | Beschreibung |
<Wert1>,<WertX> | Kommando für die aufgelisten Server ausführen |
* | Kommando auf allen Servern ausführen |
<WertX> | Kommando auf einem beliebigen Server ausführen |
Testumgebung
Server
Die in diesem Blogeintrag zur Demonstration verwendete Testumgebung wurde komplett mit der Virtualisierungslösung VirtualBox von Oracle realisiert und besteht aus den folgenden virtuellen Maschinen.
# | Server | Betriebssystem | Architektur | Aufgabe |
1 | L12CR1-R1-N1.dba-blog.local | Oracle Linux 6 Update 4 | x86_64 | 1. RAC Knoten |
1 | L12CR1-R1-N2.dba-blog.local | Oracle Linux 6 Update 4 | x86_64 | 2. RAC Knoten |
Oracle Software
Auf den virtuellen Maschinen wurden bzw. werden die folgenden Oracle Produkte installiert.
Software | Besitzer | Pfad |
Oracle Grid Infrastructure 12c Release 1 | grid | /u01/app/12.1.0/grid |
Oracle Database 12c Release 1 | oracle | /u01/app/oracle/product/12.1.0/dbome_1 |
Vorbereitung
Für die Demonstration muss eine Oracle Datenbank angelegt sein. Dabei spielt es keine Rolle, ob es sich um eine Container oder eine normale Datenbank handelt. Der COMPATIBLE Parameter der Datenbank muss mindestens auf 12.0.0.0 gesetzt sein.
Konfiguration
Die erweiterten Datentypen sind standardmäßig nicht aktiviert. Wird versucht eine Tabelle mit einem erweiterten Datentyp anzulegen, wird die folgende ORA Fehlermeldung ausgegeben.
ORA-00910: Angegebene Lange zu groß für den Datentyp
Hinweis: Das Aktivieren der erweiterten Datentypen kann nicht rückgängig gemacht werden.
Um die erweiterten Datentypen zu aktivieren, muss die Datenbank im Upgrade Modus gestartet sein.
[L11GR2-R1-NX: oracle] sqlplus / as sysdba [SQL*Plus] SHUTDOWN IMMEDIATE [SQL*Plus] STARTUP UPGRADE
Bei einer Container Database können die erweiterten Datentypen auch nur für eine einzige Pluggable Database aktiviert werden. Dafür geht man wie folgt vor.
[L11GR2-R1-NX: oracle] sqlplus / as sysdba [SQL*Plus] ALTER SESSION SET container=pdb1; [SQL*Plus] ALTER PLUGGABLE DATABASE CLOSE; [SQL*Plus] ALTER PLUGGABLE DATABASE OPEN UPGRADE;
Hinweis: Bei einer RAC Datenbank müssen zunächst alle Instanzen, bis auf eine Instanz, gestoppt werden. Zusätzlich muss der Parameter CLUSTER_DATABASE auf FALSE gesetzt sein, bevor die Datenbank im Upgrade Modus gestartet wird.
Anschließend muss der Parameter MAX_STRING_SIZE geändert werden.
[SQL*Plus] ALTER SYSTEM SET max_string_size='EXTENDED' SCOPE=both SID='*';
Zu guter letzt muss das Skript utl32k.sql ausgeführt werden. Das utl32k.sql Skript erweitert die Länge von VARCHAR2, NVARCHAR2 und RAW Spalten in Sichten bei denen es notwendig ist.
[SQL*Plus] @?/rdbms/admin/utl32k.sql
Die Ausgabe des Skriptes sollte in etwa wie folgt aussehen.
{slider=Ausgabe utl32k.sql}
[SQL*Plus] @?/rdbms/admin/utl32k.sql Session wurde geandert. 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># Es wurden keine Zeilen ausgewahlt 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-Prozedur erfolgreich abgeschlossen. Session wurde geandert. 1344 Zeilen aktualisiert. Transaktion mit COMMIT abgeschlossen. System wurde geandert. PL/SQL-Prozedur erfolgreich abgeschlossen. Transaktion mit COMMIT abgeschlossen. System wurde geandert. Session wurde geandert. PL/SQL-Prozedur erfolgreich abgeschlossen. Keine Fehler. Session wurde geandert. PL/SQL-Prozedur erfolgreich abgeschlossen. Transaktion mit COMMIT abgeschlossen. Package wurde geandert. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_BGN 2013-11-20 13:39:35 DOC> The following PL/SQL block invokes UTL_RECOMP to recompile invalid DOC> objects in the database. Recompilation time is proportional to the DOC> number of invalid objects in the database, so this command may take DOC> a long time to execute on a database with a large number of invalid DOC> objects. DOC> DOC> Use the following queries to track recompilation progress: DOC> DOC> 1. Query returning the number of invalid objects remaining. This DOC> number should decrease with time. DOC> SELECT COUNT(*) FROM obj$ WHERE status IN (4, 5, 6); DOC> DOC> 2. Query returning the number of objects compiled so far. This number DOC> should increase with time. DOC> SELECT COUNT(*) FROM UTL_RECOMP_COMPILED; DOC> DOC> This script automatically chooses serial or parallel recompilation DOC> based on the number of CPUs available (parameter cpu_count) multiplied DOC> by the number of threads per CPU (parameter parallel_threads_per_cpu). DOC> On RAC, this number is added across all RAC nodes. DOC> DOC> UTL_RECOMP uses DBMS_SCHEDULER to create jobs for parallel DOC> recompilation. Jobs are created without instance affinity so that they DOC> can migrate across RAC nodes. Use the following queries to verify DOC> whether UTL_RECOMP jobs are being created and run correctly: DOC> DOC> 1. Query showing jobs created by UTL_RECOMP DOC> SELECT job_name FROM dba_scheduler_jobs DOC> WHERE job_name like 'UTL_RECOMP_SLAVE_%'; DOC> DOC> 2. Query showing UTL_RECOMP jobs that are running DOC> SELECT job_name FROM dba_scheduler_running_jobs DOC> WHERE job_name like 'UTL_RECOMP_SLAVE_%'; DOC># PL/SQL-Prozedur erfolgreich abgeschlossen. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_END 2013-11-20 13:50:39 DOC> The following query reports the number of objects that have compiled DOC> with errors. DOC> DOC> If the number is higher than expected, please examine the error DOC> messages reported with each object (using SHOW ERRORS) to see if they DOC> point to system misconfiguration or resource constraints that must be DOC> fixed before attempting to recompile these objects. DOC># OBJECTS WITH ERRORS ------------------- 0 DOC> The following query reports the number of errors caught during DOC> recompilation. If this number is non-zero, please query the error DOC> messages in the table UTL_RECOMP_ERRORS to see if any of these errors DOC> are due to misconfiguration or resource constraints that must be DOC> fixed before objects can compile successfully. DOC># ERRORS DURING RECOMPILATION --------------------------- 0 Funktion wurde erstellt. PL/SQL-Prozedur erfolgreich abgeschlossen. Funktion wurde geloscht. PL/SQL-Prozedur erfolgreich abgeschlossen.
{/slider}
Zum Abschluss der Konfiguration muss die Datenbank wieder normal geöffnet werden.
[SQL*Plus] SHUTDOWN IMMEDIATE [SQL*Plus] STARTUP
Im Falle einer Pluggable Database muss diese wie folgt geöffnet werden. Der Name der Pluggable Database kann weggelassen werden, wenn vorher der Container auf den Namen der Pluggable Database gesetzt wurde.
[SQL*Plus] ALTER PLUGGABLE DATABASE CLOSE; [SQL*Plus] ALTER PLUGGABLE DATABASE OPEN;
Test
Zum Abschluss der Demonstration wird eine Tabelle mit erweiterten Datentypen angelegt.
[SQL*Plus] ALTER SESSION SET deferred_segment_creation=FALSE; [SQL*Plus] CREATE TABLE t1 ( varchar2_4k VARCHAR2(4000), varchar2_32k VARCHAR2(32767), nvarchar2_4k NVARCHAR2(2000), nvarchar2_32k NVARCHAR2(16383), raw_2k RAW(2000), raw_32k RAW(32767) );
Hinweis: Der NVARCHAR2 Datentyp benötigt pro Zeichen 2 Bytes. Aus diesem Grund können nur maximal 16383 Zeichen gespeichert werden.
Wie speichert Oracle die Daten intern? Diese Frage kann mithilfe der DBA_|USER_SEGMENTS View beantwortet werden.
[SQL*Plus] SELECT segment_name, segment_type, segment_subtype FROM user_segments;
SEGMENT_NAME SEGMENT_TYPE SEGMENT_SU ------------------------------ ------------------ ---------- SYS_IL0000093986C00002$$ LOBINDEX ASSM SYS_IL0000093986C00004$$ LOBINDEX ASSM SYS_IL0000093986C00006$$ LOBINDEX ASSM SYS_LOB0000093986C00002$$ LOBSEGMENT SECUREFILE SYS_LOB0000093986C00004$$ LOBSEGMENT SECUREFILE SYS_LOB0000093986C00006$$ LOBSEGMENT SECUREFILE T1 TABLE ASSM
Wird ein erweiterter Datentyp verwendet, speichert Oracle die Daten für VARCHAR2, NVARCHAR2 und RAW intern in LOBs. Bei den LOBs handelt es sich um SecureFiles wenn das Automatic Segment Space Management (ASSM) aktiviert ist. Anderenfalls werden BasicFiles verwendet.
Fazit
Die Erweiterung der maximalen Länge häufig verwendeter Datentypen, allen voran VARCHAR2, erspart den Anwendern den direkten Umgang mit LOBs und vereinfacht zum Beispiel den Umgang mit langen Texten. Zudem besitzen nun die SQL und PL/SQL Datentypen eine einheitliche Länge.
Die Verwendung der erweiterten Datentypen bringen aber auch einige Nachteile mit sich. Zum Beispiel kann es zu Problemen mit Indices und dem List Partitioning kommen.