Maximale Länge des PDB-Namens
Vor einiger Zeit fragte mich ein Kursteilnehmer, wie lang denn der Name einer Pluggable Database (PDB) sein könne. Meine spontane Antwort: 30 Zeichen. Und so war es auch in Oracle Database 12c Release 1. Aber wie sieht es in Zeiten der “long-identifiers” aus, bei denen ein Objektname bis zu 128 Bytes lang sein kann?
TL; DR: bis Oracle Database 12c Release 2 war der Name einer Pluggable Database auf maximal 30 Zeichen beschränkt, seit Oracle 18c sind es 64 Zeichen.
Gehen wir zuerst einmal zurück zur Version 12.1.0.2 der Oracle Datenbank. Auf meinem Linux-Server läuft
Installed Top-level Products (2):
Oracle Database 12c 12.1.0.2.0
Oracle Database 12c Examples 12.1.0.2.0
There are 2 products installed in this Oracle Home.
Interim patches (2) :
Patch 27001733 : applied on Wed Jan 31 21:35:15 CET 2018
Unique Patch ID: 21728084
Patch description: "Database PSU 12.1.0.2.180116, Oracle JavaVM Component (JAN2018)"
[..]
Patch 26925263 : applied on Wed Jan 31 21:33:10 CET 2018
Unique Patch ID: 21857460
Patch description: "Database Bundle Patch : 12.1.0.2.180116 (26925263)"
[..]
Für meine Test-Datenbank habe ich den Zeichensatz WE8MSWIN1252 gewählt. Lt. der View CDB_PDBS gilt, dass der Name eine PDB bis zu 128 Zeichen lang sein kann:
SQL> desc CDB_PDBS
Name Null? Type
----------------------------------------- -------- ----------------------------
PDB_ID NOT NULL NUMBER
PDB_NAME NOT NULL VARCHAR2(128)
DBID NOT NULL NUMBER
CON_UID NOT NULL NUMBER
GUID RAW(16)
STATUS VARCHAR2(9)
[..]
Lt. V$PDBS sind es aber nur 30 Zeichen:
SQL> desc v$pdbs
Name Null? Type
----------------------------------------- -------- ----------------------------
CON_ID NUMBER
DBID NUMBER
CON_UID NUMBER
GUID RAW(16)
NAME VARCHAR2(30)
OPEN_MODE VARCHAR2(10)
[..]
Also testen wir einmal lange PDB-Namen:
SQL> create pluggable database TEST_30ZEICHEN_PDBNAME4567890 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB');
Pluggable database created.
SQL> create pluggable database TEST_32ZEICHEN_PDBNAME456789012 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB2');
create pluggable database TEST_32ZEICHEN_PDBNAME456789012 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB2')
*
ERROR at line 1:
ORA-00972: identifier is too long
oracle@kereru:~/ [CDB121W] oerr ora 972
00972, 00000, "identifier is too long"
// *Cause: An identifier with more than 30 characters was specified.
// *Action: Specify at most 30 characters.
Das gleiche Ergebnis gibt es auch in einer 12.1.0.2 mit Unicode-Zeichensatz (AL32UT8).
==> Zwischenergebnis 1: in Oracle 12.1.0.2 darf der Name einer PDB maximal 30 Zeichen lang sein.
==> Ergänzung 1: Das gleiche Ergebnis gibt es auch in einer 12.1.0.2 mit Unicode-Zeichensatz (AL32UT8).
==> Ergänzung 2: Oracle Database 12c Release 2 (12.2.0.1) zeigt das gleiche Verhalten.
Setzen wir die Tests nur mit einer anderen Datenbank in der Version 19.3 fort. Datenbank-Zeichensatz ist AL32UTF8 und der Parameter NLS_LENGTH_SEMANTICS ist auf „BYTE“ gestellt. Die Datenbank hat somit die von Oracle empfohlenen Einstellungen
Die Data Dictionary View CDB_PDBS sieht identisch aus, als Länge wird „128“ angegeben. Dies sind aber – aufgrund der Längensemantic „BYTE“ – 128 Bytes.
SQL> desc cdb_pdbs
Name Null? Type
----------------------------------------- -------- ----------------------------
PDB_ID NOT NULL NUMBER
PDB_NAME NOT NULL VARCHAR2(128)
DBID NOT NULL NUMBER
CON_UID NOT NULL NUMBER
[..]
Im Vergleich zu Oracle 12.1.0.2 hat sich die View V$PDBS aber geändert:
SQL> desc v$pdbs
Name Null? Type
----------------------------------------- -------- ----------------------------
CON_ID NUMBER
DBID NUMBER
CON_UID NUMBER
GUID RAW(16)
NAME VARCHAR2(128)
[..]
=> hier sind es jetzt auch 128 Bytes.
Legen wir jetzt einmal PDBs mit längeren Namen an:
SQL> create pluggable database TEST_30ZEICHEN_PDBNAME4567890 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB');
Pluggable database created.
SQL> create pluggable database TEST_32ZEICHEN_PDBNAME456789012 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB2');
Pluggable database created.
==> Zwischenergebnis 2: Das 30 Zeichenlimit aus Oracle 12.1.0.2 gilt in Oracle 19c nicht mehr. Aber wie ist jetzt die maximale Länge für den PDB-Namen?
Wie sieht es mit 128 Zeichen aus?
SQL> create pluggable database TEST0128ZEICHEN0PDBNAM4E56789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB4');
create pluggable database TEST0128ZEICHEN0PDBNAME456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB4')
*
ERROR at line 1:
ORA-00972: identifier is too long
SQL> !oerr ora 972
00972, 00000, "identifier is too long"
// *Cause: An identifier with more than 128 bytes was specified,
// or a password identifier longer than 30 bytes was specified.
// *Action: Specify at most 128 bytes for identifiers,
// and at most 30 bytes for password identifiers.
Aber mein PDB-Name ist nur 128 Bytes lang:
SQL> select length('TEST0128ZEICHEN0PDBNAME456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678') from dual;
LENGTH('TEST0128ZEICHEN0PDBNAME4567890123456789012345678901234567890123456789012
--------------------------------------------------------------------------------
128
SQL> select dump('TEST0128ZEICHEN0PDBNAME456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678') from dual;
DUMP('TEST0128ZEICHEN0PDBNAME456789012345678901234567890123456789012345678901234
--------------------------------------------------------------------------------
Typ=96 Len=128: 84,69,83,84,48,49,50,56,90,69,73,67,72,69,78,48,80,68,66,78,65,7
7,69,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,
57,48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53
,54,55,56,57,48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57,48,49,5
0,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56
==> Zwischenergebnis 3: Die Fehlermeldung (bzw. die Erläuterung dazu) ist in Oracle 19c nicht mehr korrekt
==> Zwischenergebnis 4: die wahre maximale Länge liegt irgendwo zwischen 30 und 128 Bytes
Test mit 64 Zeichen – funktioniert:
SQL> create pluggable database TEST0064ZEICHEN0PDBNAME45678901234567890123456789012345678901234 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB4');
Aber 65 Zeichen funktionieren nicht mehr:
SQL> c file_name_convert=('pdbseed','TESTPDB4');
create pluggable database TEST0065ZEICHEN0PDBNAME456789012345678901234567890123456789012345 admin user PDBADMIN identified by manager file_name_convert=('pdbseed','TESTPDB4')
*
ERROR at line 1:
ORA-00972: identifier is too long
==> Ergebnis: der PDB-Name darf in Oracle 19c maximal 64 Zeichen lang sein.
==> Ergänzung: Oracle 18c zeigt das gleiche Verhalten.
Insgesamt gilt also: bis Oracle Database 12c Release 2 war der Name einer Pluggable Database auf maximal 30 Zeichen beschränkt, seit Oracle 18c sind es 64 Zeichen. Aber es gilt auch: nicht alles, was machbar ist, ist auch wirklich sinnvoll.
In der Oracle Dokumentation habe ich zu diesem Thema (und zu dieser Änderung in Oracle 18c) leider nichts gefunden.
Werbung (Amazon-Partner-Link)