Für den Neuaufbau der Umgebung für das Trivadis-Training Oracle Architektur und Interna wollte ich in einer 12.1.0.2 Multitenant-Datenbank unter Oracle Linux 6 mehrere Common User anlegen. Diese sollten die CONNECT und DBA Rolle sowie das SYSDBA-Privileg erhalten. Nach den ersten 8 Benutzern brach das Skript ab mit einer ORA-01996 Fehlermeldung. Die Multitenant-Datenbank wurde mit dem Database Creation Assistant DBCA erstellt.
PL/SQL Code
SQL> BEGIN 2 FOR rec IN 1..9 3 LOOP 4 BEGIN 5 EXECUTE immediate 'drop user c##dba0'||rec; 6 EXCEPTION 7 WHEN OTHERS THEN 8 NULL; 9 END; 10 EXECUTE immediate 'CREATE USER c##dba0'||rec||' IDENTIFIED BY manager'; 11 BEGIN 12 EXECUTE immediate 'GRANT connect, dba, sysdba TO c##dba0'||rec||' CONTAINER=ALL'; 13 dbms_output.put_line('Added user c##dba0'||rec); 14 EXCEPTION 15 WHEN OTHERS THEN 16 dbms_output.put_line('GRANT failed with user c##dba0'||rec||' - ' ||SQLERRM); 17 END; 18 END LOOP; 19 END; 20 / Added user c##dba01 Added user c##dba02 Added user c##dba03 Added user c##dba04 Added user c##dba05 Added user c##dba06 Added user c##dba07 Added user c##dba08 GRANT failed with user c##dba09 - ORA-01996: GRANT failed: password file '/u00/app/oracle/product/12.1.0.2/dbs/orapwTVD12CDB' is full PL/SQL procedure successfully completed.
Verifizierung vom Passwort-File
Ein Blick in das Passwort-File zeigt dass bereits 12 Einträge mit Privilegien drin sind. Nebst den vier Default-Benutzer SYS,SYSDG, SYSBACKUP und SYSKM wurden nur acht meiner Benutzer mit dem Prefix C##DBA0x eingetragen.
SQL> SELECT * FROM v$pwfile_users; USERNAME SYSDB SYSOP SYSAS SYSBA SYSDG SYSKM CON_ID ------------------------------ ----- ----- ----- ----- ----- ----- ---------- SYS TRUE TRUE FALSE FALSE FALSE FALSE 0 SYSDG FALSE FALSE FALSE FALSE TRUE FALSE 1 SYSBACKUP FALSE FALSE FALSE TRUE FALSE FALSE 1 SYSKM FALSE FALSE FALSE FALSE FALSE TRUE 1 C##DBA01 TRUE FALSE FALSE FALSE FALSE FALSE 0 C##DBA02 TRUE FALSE FALSE FALSE FALSE FALSE 0 C##DBA03 TRUE FALSE FALSE FALSE FALSE FALSE 0 C##DBA04 TRUE FALSE FALSE FALSE FALSE FALSE 0 C##DBA05 TRUE FALSE FALSE FALSE FALSE FALSE 0 C##DBA06 TRUE FALSE FALSE FALSE FALSE FALSE 0 C##DBA07 TRUE FALSE FALSE FALSE FALSE FALSE 0 C##DBA08 TRUE FALSE FALSE FALSE FALSE FALSE 0 12 rows selected.
ORA-01996
Der Fehlermeldung nach hat es zuwenig Platz für neue Einträge. Gibt man beim Erstellen eines Passwort-Files keinen ENTRIES Parameter an, so ist gemäss Oracle Dokumentation die Anzahl maximaler Einträge abhängig von der OS-Blockgrösse: http://docs.oracle.com/database/121/ADMIN/dba.htm#ADMIN11059:
For example, if your operating system block size is 512 bytes, it holds four password entries. The number of password entries allocated is always a multiple of four.
Aber: Mein OS hat eine Blockgrösse von 4096 Bytes, das heisst es müssten also 32 Einträge drin Platz haben:
root@training:/u00/app/oracle/ [12102] blockdev --getbsz /dev/sysvg/u00lv 4096
My Oracle Support
Ich habe daraufhin am 24.04.2015 einen Service Request bei Oracle eröffnet – der Fall wurde geprüft und ein Bug eröffnet:
Hello Mr. Berger,
The issue you have pointed out is easily reproducible and I have created bug 20938256 to get this clarified. Most probably you know already that you can add as many passwords to that passwordfile as you wish, if you specify a large value for the passwordfile’s ENTRIES parameter. Bug’s purpose is to clarify what would be the default number of entries on an OS having a blocksize that is different to the 512 bytes ( that was used as an example in the documentation)
Thanks
MOS Note
OERR: ORA 1996 GRANT failed: password file <name> is full (Doc ID 19282.1):
Lösung
Momentan bleibt mir nur die Neuerstellung vom Passwort-File mit Angabe von ENTRIES und dann die Neuvergabe der administrativen Privilegien. Update folgt…
$ orapwd file=orapwTVD12CDB password=***** entries=50 force=y ignorecase=n