sql >> Databáze >  >> RDS >> Oracle

Jak vyřešit ORA-29283:neplatná operace se souborem

ORA-29283:Neplatná operace se souborem je docela běžná chyba.

Stává se to většinou ze dvou důvodů

(1) Adresář a soubor by měly mít příslušná oprávnění na úrovni operačního systému pro stejného uživatele, který spustil databázi Oracle

Například

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

To se také stane, pokud adresář nemá příslušné oprávnění pro uživatele Oracle, ze kterého je databáze spuštěna.

Pokud provádíte jakoukoli změnu na úrovni skupiny na Unixu a jsou zapojeni uživatelé oracle, doporučuje se odrazit také databázi a posluchače

To se také může stát, pokud jste vytvořili adresář oracle, jako je tento

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

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

Ale v OS

neexistuje
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

To se také může stát, když čtete soubor a uživatel OS oracle k tomu nemá oprávnění

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) Druhým nejčastějším důvodem tohoto selhání je nastavení ORA_NLS10  v prostředí databáze a posluchače Oracle.

Pokud v procesu povolíte truss, soubor truss ukazuje, že je přečten blok souboru a následné bloky nelze číst nebo poškodit kvůli nastavení NLS (ORA_NLS10).

V vazníku se může zobrazit následující chyba

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

Doporučuje se mít konzistentní nastavení napříč databází a posluchačem.

Buď databáze i Listener mají nastavenou stejnou hodnotu ORA_NLS10, nebo obě nemají nastavené hodnoty.

Nastavení ORA_NLS10

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

Zrušení nastavení ORA_NLS10

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

Pokud se databáze a posluchač spouští pomocí clusteru Oracle, můžeme toto nastavení provést v srvctl.

Nastavení ORA_NLS můžeme zkontrolovat pomocí níže uvedeného příkazu v OS

Najděte proces 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

Najděte proces posluchače

ps -ef|grep list|grep TEST

For Linux:

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

For Solaris:

$ pargs -e <process ID> | grep NLS

Příklad
Pro reprodukování problému můžeme provést následující

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

Doufám, že se vám líbí tento příspěvek na téma Jak vyřešit ORA-29283:neplatná operace se souborem a pomůže vám to při odstraňování problémů

Také si přečtěte

Jak změnit heslo aplikace v R12.2
Příkaz FNDLOAD:Příkaz/zavaděč FNDLOAD je univerzální nástroj, který přesouvá strukturovaná data mezi textovým souborem a databází v prostředí EBS.
ORA-29280:neplatná cesta k adresáři
ORA-29285:chyba zápisu souboru


  1. Funkce TZ_OFFSET() v Oracle

  2. Připojení Oracle k PostgreSQL

  3. Mohou komentáře bránit výkonu uložené procedury?

  4. spouští vpřed křížové vydání v R12.2