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
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);
- processi client attivi
- processi di background
A questo punto si può procedere in due modi:
1) Workaround
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
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
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,
ATTENZIONE: Stai attento se effettui il kill perché non sai se stanno facendo delle insert.
'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
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
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