ORA-00020 maximum number of processes exceeded ๋?
ORA-00020 ์๋ฌ๋ Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค์ ์ฐ๊ฒฐ ๊ฐ๋ฅํ ์ต๋ ํ๋ก์ธ์ค ์๋ฅผ ์ด๊ณผํ์ ๋ ๋ฐ์ํ๋ ์๋ฌ์
๋๋ค. Oracle์ ์ด๊ธฐํ ํ๋ผ๋ฏธํฐ์ธ PROCESSES๋ก ๋์์ ์ ์ํ ์ ์๋ OS ํ๋ก์ธ์ค(๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค + ์๋ฒ ํ๋ก์ธ์ค ํฌํจ)์ ์ต๋๊ฐ์ ์ ํํ๋ฉฐ, ์ด ํ๋๋ฅผ ๋๋ ์๊ฐ ์ ๊ท ์ฐ๊ฒฐ ์์ฒญ์ ๋ชจ๋ ์ด ์๋ฌ์ ํจ๊ป ๊ฑฐ๋ถ๋ฉ๋๋ค. ํนํ ํธ๋ํฝ์ด ๊ธ์ฆํ๋ ์
๋ฌด ํผํฌ ํ์์ด๋ ์ปค๋ฅ์
ํ ์ค์ ์ด ์๋ชป๋ ๊ฒฝ์ฐ, ๋๋ ์ข๋น(zombie) ์ธ์
์ด ๋์ ๋ ๋ ์์ฃผ ๋ชฉ๊ฒฉ๋๋ ์๋ฌ์
๋๋ค.
์ฃผ์ ๋ฐ์ ์์ธ
1. PROCESSES ํ๋ผ๋ฏธํฐ ๊ฐ์ด ์ค์ ๋ถํ์ ๋นํด ๋๋ฌด ๋ฎ๊ฒ ์ค์ ๋ ๊ฒฝ์ฐ
Oracle ์ค์น ์ ๊ธฐ๋ณธ๊ฐ์ด๋ ๊ณผ๊ฑฐ ํธ๋ํฝ ๊ธฐ์ค์ผ๋ก PROCESSES ๊ฐ์ ์ค์ ํ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์๋ ์๋ฒ ์๊ฐ ์ฆ๊ฐํ์ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ์ง ์์ผ๋ฉด ๊ธ๋ฐฉ ํ๊ณ์ ๋๋ฌํฉ๋๋ค. ํนํ PROCESSES ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค(PMON, SMON, DBWR ๋ฑ)๋ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ค์ ์ ์ ์ธ์ ์๋ณด๋ค ์ฌ์ ์๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค.
2. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปค๋ฅ์ ๋์(Connection Leak) ๋๋ ์ข๋น ์ธ์ ๋์
์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์์ DB ์ปค๋ฅ์
์ ์ฌ์ฉ ํ ๋ช
์์ ์ผ๋ก ๋ฐํํ์ง ์๊ฑฐ๋, WAS(์น ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ)์ ์ปค๋ฅ์
ํ์ด ๋น์ ์ ์ข
๋ฃ๋ ์ธ์
์ ์ ๋ฆฌํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ์ธ์
์ด ๊ณ์ ๋์ ๋ฉ๋๋ค. ์ด๋ฐ ์ข๋น ์ธ์
๋ค์ V$SESSION์์๋ INACTIVE ์ํ๋ก ๋ณด์ด์ง๋ง ์ค์ OS ๋ ๋ฒจ ํ๋ก์ธ์ค๋ฅผ ์ ์ ํ๊ณ ์์ด ๊ฒฐ๊ตญ PROCESSES ํ๋๋ฅผ ์์ง์ํต๋๋ค.
3. ๋ฐฐ์น ์์ ๋๋ ์ธ๋ถ ์ฐ๋ ํ๋ก๊ทธ๋จ์ ํญ๋ฐ์ ์ธ ๋์ ์ ์
์ผ๊ฐ ๋ฐฐ์น ์์ ์ด ์ฌ๋ฌ ์ค๋ ๋๋ก ๋์์ DB์ ์ฐ๊ฒฐํ๊ฑฐ๋, ์ธ๋ถ ์ฐ๋ ์์คํ ์ด ์งง์ ์๊ฐ์ ๋๋์ ์ปค๋ฅ์ ์ ์ด ๋ ์๊ฐ์ ์ผ๋ก PROCESSES ํ๋๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค. ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ์ง ์๊ณ ๋งค๋ฒ ์ ์ปค๋ฅ์ ์ ์์ฑํ๋ ๊ตฌ์กฐ์ ๋ ๊ฑฐ์ ์์คํ ์์ ํนํ ์์ฃผ ๋ฐ์ํ๋ฉฐ, ์ด๋ฐ ํจํด์ ์ด์ ํ๊ฒฝ์์ ์ฌ์ ์ ๋ฐ๋์ ๊ฒํ ํด์ผ ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
โ ์ฆ๊ฐ์ ์ธ ํํฉ ํ์ โ ํ์ฌ ์ธ์ ๋ฐ ํ๋ก์ธ์ค ์ ํ์ธ
์๋ฌ ๋ฐ์ ์งํ ๊ฐ์ฅ ๋จผ์ ํ์ฌ ์ํ๋ฅผ ํ์
ํด์ผ ํฉ๋๋ค.
-- ํ์ฌ PROCESSES ํ๋ผ๋ฏธํฐ ๊ฐ๊ณผ ์ค์ ์ฌ์ฉ ์ค์ธ ํ๋ก์ธ์ค ์ ๋น๊ต
SELECT
p.value AS processes_limit,
COUNT(s.sid) AS current_sessions,
p.value - COUNT(s.sid) AS remaining_capacity
FROM v$parameter p, v$session s
WHERE p.name = 'processes'
GROUP BY p.value;
-- ์ํ๋ณ ์ธ์
ํํฉ (ACTIVE / INACTIVE ๊ตฌ๋ถ)
SELECT
status,
COUNT(*) AS session_count
FROM v$session
GROUP BY status
ORDER BY session_count DESC;
-- ์ฌ์ฉ์๋ณ ์ธ์
์ ์ ํํฉ (์์ 10๋ช
)
SELECT
username,
COUNT(*) AS session_count,
SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) AS active_cnt,
SUM(CASE WHEN status = 'INACTIVE' THEN 1 ELSE 0 END) AS inactive_cnt
FROM v$session
WHERE username IS NOT NULL
GROUP BY username
ORDER BY session_count DESC
FETCH FIRST 10 ROWS ONLY;
โก ์ข๋น ์ธ์ ์ฆ์ ์ ๋ฆฌ
์ค๋๋ INACTIVE ์ธ์
์ ๊ฐ์ ์ข
๋ฃํ์ฌ ๋น ๋ฅด๊ฒ ์ฌ์ ๊ณต๊ฐ์ ํ๋ณดํฉ๋๋ค.
-- 30๋ถ ์ด์ ์๋ฌด ์์
๋ ํ์ง ์์ INACTIVE ์ธ์
๋ชฉ๋ก ์กฐํ
SELECT
sid,
serial#,
username,
status,
machine,
program,
ROUND((SYSDATE - last_call_et / 86400) * 1440) AS inactive_min,
last_call_et
FROM v$session
WHERE status = 'INACTIVE'
AND username IS NOT NULL
AND last_call_et > 1800 -- 1800์ด(30๋ถ) ์ด์ ๋นํ์ฑ
ORDER BY last_call_et DESC;
-- ํน์ ์ธ์
๊ฐ์ ์ข
๋ฃ (SID, SERIAL# ํ์ธ ํ ์คํ)
ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE;
-- ์ฌ๋ฌ ์ข๋น ์ธ์
์ ํ ๋ฒ์ ์ข
๋ฃํ๋ ์คํฌ๋ฆฝํธ ์์ฑ
SELECT
'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
AS kill_script
FROM v$session
WHERE status = 'INACTIVE'
AND username IS NOT NULL
AND last_call_et > 3600; -- 1์๊ฐ ์ด์ ๋นํ์ฑ ์ธ์
โ ๏ธ ์ฃผ์:
KILL SESSION์คํ ์ ๋ฐ๋์ ํด๋น ์ธ์ ์ด ์ ๋ฌด์ ํ์ํ ์ธ์ ์ธ์ง ํ์ธํ์ธ์.
โข PROCESSES ํ๋ผ๋ฏธํฐ ๊ฐ ์ํฅ ์กฐ์
๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ ์ํด ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋๋ฆฝ๋๋ค. PROCESSES๋ ๋์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐํ๋ฏ๋ก SPFILE ์์ ํ ์ฌ๊ธฐ๋์ด ํ์ํฉ๋๋ค.
-- ํ์ฌ PROCESSES ๊ด๋ จ ํ๋ผ๋ฏธํฐ ์ ์ฒด ํ์ธ
SELECT name, value, description
FROM v$parameter
WHERE name IN ('processes', 'sessions', 'transactions')
ORDER BY name;
-- SPFILE์ ์ด์ฉํ PROCESSES ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ
-- (SESSIONS = PROCESSES * 1.1 + 5, TRANSACTIONS = SESSIONS * 1.1 ๊ณต์ ์ฐธ๊ณ )
ALTER SYSTEM SET PROCESSES = 500 SCOPE = SPFILE;
-- SESSIONS์ TRANSACTIONS๋ PROCESSES ๋ณ๊ฒฝ ์ ํจ๊ป ์กฐ์ ๊ถ์ฅ
ALTER SYSTEM SET SESSIONS = 555 SCOPE = SPFILE;
ALTER SYSTEM SET TRANSACTIONS = 611 SCOPE = SPFILE;
-- ๋ณ๊ฒฝ ํ ์ฌ๊ธฐ๋ ํ์ (DBA ํ์ธ ํ ์ํ)
-- SHUTDOWN IMMEDIATE;
-- STARTUP;
-- ์ฌ๊ธฐ๋ ํ ์ ์ฉ ํ์ธ
SELECT name, value
FROM v$parameter
WHERE name IN ('processes', 'sessions', 'transactions');
๐ก ๊ถ์ฅ ๊ณต์:
SESSIONS = CEIL(PROCESSES * 1.1) + 5TRANSACTIONS = CEIL(SESSIONS * 1.1)
โฃ IDLE_TIME ํ๋กํ์ผ๋ก ๋นํ์ฑ ์ธ์ ์๋ ์ ๋ฆฌ
-- ์ฌ์ฉ์ ํ๋กํ์ผ์ IDLE_TIME ์ค์ (๋จ์: ๋ถ)
-- ๊ธฐ์กด DEFAULT ํ๋กํ์ผ ์์
ALTER PROFILE default LIMIT IDLE_TIME 30;
-- ํน์ ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ ์ ์ฉ ํ๋กํ์ผ ์์ฑ
CREATE PROFILE app_user_profile LIMIT
IDLE_TIME 30 -- 30๋ถ ์ด์ ๋นํ์ฑ ์ ์๋ ์ข
๋ฃ
SESSIONS_PER_USER 50 -- ๋์ผ ์ ์ ์ต๋ ์ธ์
์ ์ ํ
CONNECT_TIME 480; -- ์ต๋ ์ฐ๊ฒฐ ์ ์ง ์๊ฐ (๋ถ)
-- ํ๋กํ์ผ์ ํน์ ๊ณ์ ์ ์ ์ฉ
ALTER USER app_user PROFILE app_user_profile;
-- ์ ์ฉ ํ์ธ
SELECT username, profile
FROM dba_users
WHERE username = 'APP_USER';
์๋ฐฉ ๋ฐฉ๋ฒ
1. ๋ชจ๋ํฐ๋ง ์๋ฆผ ์ฒด๊ณ ๊ตฌ์ถ โ PROCESSES ์ฌ์ฉ๋ฅ ์๊ณ์น ๊ฒฝ๋ณด
PROCESSES ํ๋ผ๋ฏธํฐ ๋๋น ์ค์ ์ฌ์ฉ๋ฅ ์ด 80%๋ฅผ ๋์ผ๋ฉด ์ฌ์ ์ ์๋์ ๋ฐ์ ์ ์๋๋ก ๋ชจ๋ํฐ๋ง ์คํฌ๋ฆฝํธ๋ OEM(Oracle Enterprise Manager) ์๊ณ์น๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ์๋ ์ฟผ๋ฆฌ๋ฅผ ํฌ๋ก ์ก(cron) ๋๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ์ ๋ฑ๋กํด ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํ๋ฉด ์ฅ์ ์ ์ ์ ์ ์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค.
-- PROCESSES ์ฌ์ฉ๋ฅ ์ฒดํฌ ์ฟผ๋ฆฌ (80% ์ด๊ณผ ์ ๊ฒฝ๊ณ ํ์)
SELECT
p.value AS max_processes,
COUNT(s.sid) AS used_processes,
ROUND(COUNT(s.sid) / p.value * 100, 2) AS usage_pct,
CASE
WHEN ROUND(COUNT(s.sid) / p.value * 100, 2) >= 90
THEN '๐จ CRITICAL'
WHEN ROUND(COUNT(s.sid) / p.value * 100, 2) >= 80
THEN 'โ ๏ธ WARNING'
ELSE 'โ
NORMAL'
END AS status
FROM v$parameter p, v$session s
WHERE p.name = 'processes'
GROUP BY p.value;
2. ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ ์ปค๋ฅ์ ํ ๋ฐ Connection Validation ์ค์ ๊ฐํ
WAS(Tomcat, WebLogic, JBoss ๋ฑ)์ ์ปค๋ฅ์
ํ์์ testOnBorrow, validationQuery, removeAbandonedTimeout ๋ฑ์ ์ต์
์ ๋ฐ๋์ ํ์ฑํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์์ ์ปค๋ฅ์
์ ๊บผ๋ผ ๋๋ง๋ค ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ณ , ์ผ์ ์๊ฐ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ปค๋ฅ์
์ ์๋์ผ๋ก ํ์ํ์ฌ ์ข๋น ์ธ์
์ด DB ์ธก์ ๋์ ๋๋ ๊ฒ์ ์์ฒ ์ฐจ๋จํ ์ ์์ต๋๋ค. ๋ํ ์ปค๋ฅ์
ํ์ maxTotal(์ต๋ ์ปค๋ฅ์
์)์ DB์ PROCESSES ํ๋๋ฅผ ๊ณ ๋ คํ์ฌ ์๋ฒ ๋์์ ๋ง๊ฒ ์ ์ ํ ๋ถ๋ฐฐํด์ผ ํฉ๋๋ค.
๊ด๋ จ ์๋ฌ
| ์๋ฌ ์ฝ๋ | ์ค๋ช |
|---|---|
| ORA-00018 |
maximum number of sessions exceeded โ SESSIONS ํ๋ผ๋ฏธํฐ ์ด๊ณผ. ORA-00020๊ณผ ํจ๊ป ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ |
| ORA-00019 |
maximum number of session licenses exceeded โ ๋ผ์ด์ ์ค ๊ธฐ๋ฐ ์ธ์
์ ํ ์ด๊ณผ |
| ORA-12519 |
TNS: no appropriate service handler found โ ๋ฆฌ์ค๋๊ฐ DB์ ์ฐ๊ฒฐ์ ์ ๋ฌํ์ง ๋ชปํ ๋ ๋ฐ์ํ๋ฉฐ, ORA-00020 ์ํฉ์์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ๋ ์๋ฌ |
| ORA-12516 |
TNS: listener could not find available handler with matching protocol stack โ ๊ฐ์ฉ ์๋ฒ ํ๋ก์ธ์ค ๋ถ์กฑ ์ ๋ฐ์ |
| ORA-04031 |
unable to allocate shared memory โ PROCESSES ์ฆ๊ฐ ์ SGA ํฌ๊ธฐ๋ ํจ๊ป ๊ฒํ ํด์ผ ํ๋ ์ฐ๊ด ์๋ฌ |
๐ ์ค๋ฌด ํ: ORA-00020 ๋ฐ์ ์ ํด๋ผ์ด์ธํธ(์ ํ๋ฆฌ์ผ์ด์ )์์๋ ์ฃผ๋ก
ORA-12519๋๋ORA-12516์ผ๋ก ์๋ฌ๊ฐ ๋ณด๊ณ ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ๋ก๊ทธ์ ์ด ๋ ์๋ฌ๊ฐ ๋ฐ๋ณต๋๋ค๋ฉด ์๋ฒ ์ธกV$SESSION/V$PROCESSํํฉ์ ์ฆ์ ์ ๊ฒํ์ธ์.











