===== 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//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