Oracle
 sql >> Database >  >> RDS >> Oracle

Come risolvere ORA-29283:operazione su file non valida

ORA-29283:l'operazione su file non validi è un errore abbastanza comune.

Succede principalmente per i due motivi

(1) La directory e il file devono disporre dell'autorizzazione appropriata a livello di sistema operativo per lo stesso utente che ha avviato il database Oracle

Ad esempio

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

Ciò accade anche se la directory non dispone dell'autorizzazione appropriata per l'utente Oracle da cui viene avviato il database.

Se stai apportando modifiche a livello di gruppo su Unix e sono coinvolti utenti Oracle, si consiglia di eseguire il rimbalzo sia del database che del listener

Questo può succedere anche se hai creato una directory Oracle come questa

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

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

Ma non esiste nel sistema operativo

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

Questo può accadere anche quando stai leggendo il file e l'utente oracle del sistema operativo non dispone dell'autorizzazione per farlo

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) La seconda ragione principale di questo errore è l'impostazione di ORA_NLS10 nel database Oracle e nell'ambiente listener.

Se abiliti il ​​truss sul processo, il file Truss mostra che un blocco del file è stato letto e i blocchi successivi non possono essere letti o danneggiati a causa delle impostazioni NLS (ORA_NLS10).

Il seguente errore potrebbe essere visualizzato nel truss

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

Si consiglia di avere impostazioni coerenti nel database e nel listener.

Sia il database che Listener hanno lo stesso ORA_NLS10 impostato o entrambi hanno i valori non impostati.

Impostazione ORA_NLS10

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

Disimpostazione di ORA_NLS10

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

Se il database e il listener vengono avviati utilizzando il cluster Oracle, possiamo eseguire questa impostazione in srvctl.

Possiamo controllare l'impostazione di ORA_NLS usando il comando seguente nel sistema operativo

Trova il processo PMON

ps -ef|grep pmon|grep TEST

For Linux:

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

For Solaris:

$ pargs -e <process ID> | grep NLS

Trova il processo di ascolto

ps -ef|grep list|grep TEST

For Linux:

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

For Solaris:

$ pargs -e <process ID> | grep NLS

Esempio
Possiamo fare quanto segue per riprodurre il problema

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

Spero ti piaccia questo post su Come risolvere ORA-29283:operazione su file non valida e questo aiuta nella risoluzione dei problemi

Inoltre, leggi

Come modificare la password delle app in R12.2
FNDLOAD Command:FNDLOAD command/loader è un'utilità generica che sposta i dati strutturati tra un file di testo e un database in un ambiente EBS.
ORA-29280:percorso della directory non valido
ORA-29285:errore di scrittura del file