Inhaltsverzeichnis
ORA-29283: invalid file operation in einer RAC Umgebung
Das Problem:
Mit UTL_FILE soll in einer Oracle RAC Umgebung aus der Datenbank auf einen NFS Share geschrieben werden.
Beim Schreiben über eine vom Anwender aufgerufenen PL/SQL Procedure wird der folgende Fehler gerufen:
Error: no permission - -29283 - ORA-29283: niepoprawna operacja na pliku ORA-06512: przy "SYS.UTL_FILE", linia 41 ORA-06512: przy "SYS.UTL_FILE", linia 512 ORA-29283: niepoprawna operacja na pliku
Kontrolle der Umgebung:
- Das verwendete Oracle Directory zeigt auf ein Verzeichnis auf dem Share
- Der nfs mount ist mit den richtigen Parametern gemountet
- see: Mount Options for Oracle files when used with NFS on NAS devices (Doc ID 359515.1)
- Der nfs mount ist von allen Knoten erreichbar
- Der nfs mount kann vom Owner der Oracle DB Software (oracle) beschrieben und gelesen werden.
- Der nfs mount kann vom Owner des Cluster Stacks (grid) beschrieben und gelesen werden.
- Der DBA kann die Procedure aufrufen und die Daten werden auf dem nfs mount geschrieben
- Meldet sich der Anwender local auf dem Server per sqlplus über die SID an, können auch die Daten geschrieben werden
- Meldet sich der Anwender über die SID im tnsconnect String an der DB an, können die Daten geschrieben werden
- Meldet sich der Anwender über einen Service an der DB an, wird der Fehler geworfen!
Test Case
Um das ganze sauber zu testen wird der folgnde Testcase verwandt um eine einfache Datei zu schreiben und zu lesen:
-- create directory with the link to the nfs CREATE OR REPLACE directory WRITE_TEST AS '/nfs/share/data'; -- test SET serveroutput ON DECLARE input_file utl_file.file_type; input_buffer varchar2(32767); BEGIN input_file := UTL_FILE.FOPEN('WRITE_TEST', 'oracle_db_export.txt','w'); UTL_FILE.PUT_LINE(input_file, 'This is a line in the export file'); utl_file.fclose(input_file); END; / SET serveroutput ON DECLARE input_file utl_file.file_type; input_buffer varchar2(32767); BEGIN input_file := UTL_FILE.FOPEN('WRITE_TEST', 'oracle_db_export.txt','r',32767); utl_file.get_line (input_file,input_buffer); dbms_output.put_line(input_buffer); utl_file.fclose(input_file); END; /
Mit dem Testcase tritt der Fehler NUR auf, wenn die Verbindung zur DB via SQL*Net über einem im Cluster registrierten Service aufgebaut wird.
Kontrolle der Rechte im Cluster
OS Gruppen Rechte
Die User oracle und grid sind Mitglieder in der Gruppe, die auf das NFS schreiben darf. Die Gruppe heißt NFS_SHARE
id oracle id grid
Auf die groups achten, dass bei beiden die NFS_SHARE auch hinterlegt sind.
Prozess Rechte des Listener prüfen
Da die Rechte vorhanden sind, muss das Problem muss etwas mit dem Rechten zu tun haben unter dem der Listener Prozess auf der Umgebung läuft.
Auf jeden Knoten über die Datei /proc/<prozess_id>/status prüfen:
-- Process id des Listener ermitteln ps uafx | grep LISTENER_GPI grid 5656 ... -- aktuelle Rechte des Listender prüfen -- auf die Spalte cat /proc/5656/status .. Groups: 509 607 1001 ..
Überprüfen ob die ID der NFS_SHARE in dieser Liste enthalten ist, falls nicht ist der Fehler gefunden!
Lösung
Der gesamte Clusterstack muss nach einer Rechte Änderung am GRID Owner neu gestartet werden, eine Änderung der Rechte der User reicht nicht aus!
Weitere Informationen - NFS Mount Optionen
siehe Support Node für die Mount Optionen:
- Mount Options for Oracle files when used with NFS on NAS devices (Doc ID 359515.1)
Zum Beispiel für DB Dateien und DataPump Exports unter Linux 64 :
- RAC: rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,actimeo=0, vers=3,timeo=600
- Single Instance: rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,tcp