Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So lösen Sie ORA-29283:Ungültiger Dateivorgang

ORA-29283:Ungültiger Dateivorgang ist ein ziemlich häufiger Fehler.

Dies geschieht hauptsächlich aus zwei Gründen

(1) Das Verzeichnis und die Datei sollten die entsprechende Berechtigung auf Betriebssystemebene für denselben Benutzer haben, der die Oracle-Datenbank gestartet hat

Zum Beispiel

The directory does not exists on OS

ls  /u555/app/oracle

No such file or directory

SQL> declare
F_LOG utl_file.file_type;
begin
F_LOG := utl_file.fopen('/u555/app/oracle','k', 'w');
end;
/ 2 3 4 5 6
declare
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 4

Dies passiert auch, wenn das Verzeichnis nicht die entsprechende Berechtigung für den Oracle-Benutzer hat, von dem aus die Datenbank gestartet wird.

Wenn Sie unter Unix Änderungen auf Gruppenebene vornehmen und Oracle-Benutzer beteiligt sind, wird empfohlen, sowohl die Datenbank als auch den Listener zu senden

Dies kann auch passieren, wenn Sie ein Oracle-Verzeichnis wie dieses erstellt haben

SQL> create directory TESTDIR as '/u555/oracle/tmp';

SQL> grant read,write on directory TESTDIR to public;

Aber es existiert nicht im Betriebssystem

SQL> declare
F_LOG  utl_file.file_type;
begin
F_LOG := utl_file.fopen('TESTDIR','k', 'w');
end;
/  2    3    4    5    6
declare
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 4

Dies kann auch passieren, wenn Sie die Datei lesen und der Oracle-Benutzer des Betriebssystems keine Berechtigung dazu hat

SQL> declare
F_LOG utl_file.file_type;
begin
F_LOG := utl_file.fopen('/u555/app/oracle','k', 'r');
end;
/ 2 3 4 5 6
declare
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 4

(2) Der zweithäufigste Grund für diesen Fehler ist die Einstellung von ORA_NLS10 in der Oracle-Datenbank und Listener-Umgebung.

Wenn Sie Truss für den Prozess aktivieren, zeigt die Truss-Datei, dass ein Block der Datei gelesen wird und nachfolgende Blöcke aufgrund der NLS-Einstellungen (ORA_NLS10) nicht gelesen oder beschädigt werden können.

Der folgende Fehler kann im Fachwerk angezeigt werden

file read error
file write error
internal error
invalid maximum line size
invalid file name
directory access denied
invalid offset specified for seek
file remove operation failed
file rename operation failed
A stream error occurred during compression or uncompression.
A data error occurred during compression or uncompression.
invalid mime header tag
invalid encoded string
The compressed representation is too big

Es wird empfohlen, konsistente Einstellungen für die Datenbank und den Listener zu haben.

Entweder haben sowohl die Datenbank als auch der Listener denselben ORA_NLS10-Satz oder beide haben die Werte nicht gesetzt.

ORA_NLS10 einstellen

ORACLE_SID=TEST
ORA_NLS10=< >
sqlplus / as sysdba
shutdown immediate
startup
lsnrctl stop TEST
lsnrctl start TEST

ORA_NLS10 zurücksetzen

ORACLE_SID=TEST
unset ORA_NLS10
sqlplus / as sysdba
shutdown immediate
startup
lsnrctl stop TEST
lsnrctl start TEST

Wenn die Datenbank und der Listener mit dem Oracle-Cluster gestartet werden, können wir diese Einstellung in der srvctl vornehmen.

Wir können die Einstellung von ORA_NLS mit dem folgenden Befehl im Betriebssystem überprüfen

Suchen Sie den PMON-Prozess

ps -ef|grep pmon|grep TEST

For Linux:

$ strings /proc/<pmon process ID>/environ | grep NLS

For Solaris:

$ pargs -e <process ID> | grep NLS

Finden Sie den Listener-Prozess

ps -ef|grep list|grep TEST

For Linux:

$ strings /proc/<pmon process ID>/environ | grep NLS

For Solaris:

$ pargs -e <process ID> | grep NLS

Beispiel
Wir können wie folgt vorgehen, um das Problem zu reproduzieren

ORA_NLS10=< >
sqlplus / as sysdba
shutdown immediate
startup
lsnrctl stop TEST
lsnrctl start TEST

Now unset ORA_NLS10
Now Setup Bequeath connection
sqlplus / as sysdba
SQL> declare
F_LOG  utl_file.file_type;
begin
F_LOG := utl_file.fopen('TESTDIR','k', 'w');
end;
/  2    3    4    5    6
declare
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 4

Ich hoffe, Ihnen gefällt dieser Beitrag zur Lösung von ORA-29283:Ungültiger Dateivorgang, und dies hilft bei der Fehlerbehebung

Auch lesen

So ändern Sie das App-Passwort in R12.2
FNDLOAD-Befehl:Der FNDLOAD-Befehl/Loader ist ein Allzweck-Dienstprogramm, das strukturierte Daten zwischen einer Textdatei und einer Datenbank in einer EBS-Umgebung verschiebt.
ORA-29280:Ungültiger Verzeichnispfad
ORA-29285:Dateischreibfehler