ORA-00020: maximum number of processes (***) exceeded

L'errore si verifica quando il numero di processi del sistema operativo connessi al database ha superato il valore del parametro PROCESSES


Vedere le sessioni\processi sul db.

SQL> select current_utilization, limit_value , resource_name from v$resource_limit  where resource_name in ('sessions','processes');

processes= numero di OS user processes che possono connettersi simultaneamente
sessions=user and system sessions

Le sessioni è un parametro che deriva dai processi:
sessions = (processes *1,5) + 22


Se cambia il valore di processes cambia anche quello di sessions.

SQL> select username, count(*)  from v$session  where username = 'PERLO' group by rollup(username); 

SQL> show parameters processes;


I processi attuali sono dati dalla somma dei 

-  processi client attivi 
ps -ef | grep <SID> | grep -i LOCAL=NO |  wc -l

- processi di background
ps -ef | grep <SID> | grep ora_ |  wc -l




A questo punto si può procedere in due modi:

1) Workaround

Dal server linux eseguire il comando:
# kill -9 spid
dove spid è stato estratto  dai processi attivi con il comando precedente

Oppure da database oracle estraendo i processi da killare con la seguente query:
SQL>  select --p.spid,
 'alter system kill session '||''''|| s.sid ||','|| s.serial# ||''';'
FROM v$session s,v$process p
WHERE p.addr=s.paddr
and p.program='oracle@oradbs04.intra.camera.it (TNS V1-V3)'
and p.spid <> 22981

SQL> alter system kill session '11,16646';

ATTENZIONE: Stai attento se effettui il kill perché non sai se stanno facendo delle insert.


2) Soluzione: aumentate il valore di parameter processes

Se usi init.ora:
1. Modificarte init.ora
2. Aumentare il parametro processes ad un valore più alto
3. Salvare il file init.ora
4. Stop and restart the database
5. Reconnect to the database instance


Se usi spfile:
a. Modificare spfile, aumentando il parametro processes ad un valore più grande. 

cd $ORACLE_HOME/dbs 
Se contiene il parametro “processes=150”, raddoppialo

SQL> alter system set processes=300 scope=spfile;

Essendo un parametro statico la modifica va fatta a livello di spfile e quindi deve essere riavviata l’istanza.

b. Stop and restart the database

SQL> shutdown immediate
SQL> startup;


3. Reconnect to the database instance
 


Vediamo i processi esistenti quando si verifica l’errore ORA-00020 

SQL> connect /as sysdba


set markup html on

set pagesize 30

spool processes_sessions.html


select

p.username "V$PROCESS - OS USERNAME",

p.terminal,

p.program,

s.username "V$SESSION - USERNAME",

s.command,

s.status,

to_char(s.LOGON_TIME,'DD-MON-YY HH24:MI:SS') "LOGON TIME",

s.LAST_CALL_ET/60 "LAST_CALL TIME",

s.server,

s.process,

s.machine,

s.port,

s.terminal,

s.program,

s.sid,

s.serial#,

p.spid

FROM v$session s,v$process p

WHERE p.addr=s.paddr

order by p.background desc;


spool off

exit;


La colonna LAST_CALL TIME indica il tempo trascorso in minuti da quando la sessione è diventata inattiva o attiva.


Estrazione testo delle istruzioni sql in corso:

SELECT s.sid, s.status, s.process, s.schemaname, s.osuser, a.sql_text, p.program FROM v$session s, v$sqlarea a, v$process p WHERE s.SQL_HASH_VALUE = a.HASH_VALUE AND s.SQL_ADDRESS = a.ADDRESS AND s.PADDR = p.ADDR



Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database