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
