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

Chiamando lo script della shell da PL/SQL, ma la shell viene eseguita come utente della griglia, non come Oracle

Il problema, come sottolineato nei commenti, è che Runtime.getRuntime().exec viene eseguito tramite EXTPROC e quindi tramite Grid Listener. Poiché abbiamo l'isolamento degli utenti del sistema operativo tra DB e GRID sulla nostra nuova configurazione, ciò ha sollevato un problema di autorizzazione su FS.

La soluzione a questo è una delle seguenti:

  • Risolto il problema con l'autorizzazione FS per consentire all'utente della griglia di scrivere i file e modificare umask in qualcosa come 774 o 664, quindi sia gli utenti della griglia che quelli di Oracle potranno modificare i file in un secondo momento;

  • cambia il file sudoers e consenti alla griglia di eseguire i comandi necessari come oracle senza password e cambia lo script della shell per includere sudo;

  • creare un nuovo listener su DB Home su un'altra porta e modificare la voce TNSNAMES.ORA in modo che punti alla nuova porta. Quindi extproc verrà eseguito come oracle dell'utente del sistema operativo. Dovrai modificare manualmente LISTENER.ORA su $OH e avviarlo con lsnrctl, perché i listener registrati con srvctl verranno sempre avviati dalla griglia;

  • cambia l'ascoltatore principale nella home del db. Non lo consiglio (vedi voce sopra).

[EDIT]Come sottolineato da @AlexPoole e @jonearles, ci sono altre due opzioni che non erano adatte al mio caso, ma potrebbero esserlo per altre:

  • se esegui lo script in locale su sqlplus, impostando ORACLE_SID, l'accesso FS verrà effettuato dall'utente del sistema operativo che esegue sqlplus. Quindi puoi eseguire come Oracle o qualche altro utente e correggere i permessi di FS;
  • se pianifichi un lavoro su dbms_job scheduler come SYS, l'attività verrà eseguita da Oracle (questo comportamento potrebbe dipendere dalla versione, quindi sono necessari ulteriori test).

Saluti,

Daniel Stolf