ORA-01996: GRANT failed: password file

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