Maximale Länge des PDB-Namens

28. Juni 2019 Aus Von Markus Flechtner

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)