Skip to content

ORA-00018 Maximum Number of Sessions Exceeded - Session Limit Solutions

ORA-00018: Maximum Number of Sessions Exceeded

Section titled “ORA-00018: Maximum Number of Sessions Exceeded”

Error Text: ORA-00018: maximum number of sessions exceeded

This error occurs when the number of concurrent sessions reaches the maximum limit defined by the SESSIONS initialization parameter. It prevents new database connections from being established and is a critical capacity planning issue.

SESSIONS Parameter
├── Default: Derived from PROCESSES parameter
├── Formula: (1.1 * PROCESSES) + 5
├── Range: 1 to 2147483647
└── Scope: Instance-level, requires restart
  • PROCESSES - Maximum OS processes (base for SESSIONS)
  • LICENSE_MAX_SESSIONS - Licensed session limit
  • LICENSE_SESSIONS_WARNING - Warning threshold
-- Connection pool exhaustion
-- Abandoned connections not closed
-- Runaway processes creating multiple sessions
-- Poor connection management in applications
  • SESSIONS parameter set too low
  • Inadequate capacity planning
  • License limitations
  • Resource constraints
-- Check current session usage
SELECT
'Current Sessions' as metric,
COUNT(*) as current_value,
(SELECT value FROM v$parameter WHERE name = 'sessions') as max_sessions,
ROUND((COUNT(*) / (SELECT value FROM v$parameter WHERE name = 'sessions')) * 100, 2) as usage_percent
FROM v$session;
-- Analyze session types
SELECT
type,
status,
COUNT(*) as session_count
FROM v$session
GROUP BY type, status
ORDER BY session_count DESC;
-- Identify heavy session users
SELECT
username,
machine,
program,
COUNT(*) as session_count,
MIN(logon_time) as oldest_session,
MAX(logon_time) as newest_session
FROM v$session
WHERE username IS NOT NULL
GROUP BY username, machine, program
ORDER BY session_count DESC;
-- Check session trends from AWR
SELECT
snap_id,
begin_interval_time,
value as sessions_used
FROM dba_hist_sysstat s,
dba_hist_snapshot sn
WHERE s.snap_id = sn.snap_id
AND s.stat_name = 'logons current'
ORDER BY begin_interval_time DESC
FETCH FIRST 24 ROWS ONLY;
-- Find long-running inactive sessions
SELECT
'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;' as kill_command
FROM v$session
WHERE status = 'INACTIVE'
AND last_call_et > 3600 -- Inactive for more than 1 hour
AND username IS NOT NULL;
-- Check current value
SELECT name, value, isdefault
FROM v$parameter
WHERE name IN ('sessions', 'processes');
-- Increase sessions (requires restart)
ALTER SYSTEM SET sessions=2000 SCOPE=SPFILE;
-- Monitor connection pool efficiency
SELECT
machine,
program,
COUNT(*) as connections,
COUNT(DISTINCT username) as unique_users,
ROUND(COUNT(*) / COUNT(DISTINCT username), 2) as connections_per_user
FROM v$session
WHERE username IS NOT NULL
GROUP BY machine, program
HAVING COUNT(*) > 10
ORDER BY connections DESC;
// Example: Proper connection handling in Java
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
// Use connection
} catch (SQLException e) {
// Handle error
} // Connection automatically closed
-- Create monitoring view
CREATE OR REPLACE VIEW session_monitor AS
SELECT
SYSDATE as check_time,
COUNT(*) as current_sessions,
(SELECT value FROM v$parameter WHERE name = 'sessions') as max_sessions,
ROUND((COUNT(*) / (SELECT value FROM v$parameter WHERE name = 'sessions')) * 100, 2) as usage_percent,
CASE
WHEN COUNT(*) / (SELECT value FROM v$parameter WHERE name = 'sessions') > 0.9
THEN 'CRITICAL'
WHEN COUNT(*) / (SELECT value FROM v$parameter WHERE name = 'sessions') > 0.8
THEN 'WARNING'
ELSE 'OK'
END as status
FROM v$session;
-- Calculate recommended SESSIONS value
SELECT
'Recommended SESSIONS' as parameter,
GREATEST(
ROUND(MAX(daily_sessions) * 1.5), -- 50% headroom
500 -- Minimum recommendation
) as recommended_value
FROM (
SELECT
TRUNC(begin_interval_time) as day,
MAX(value) as daily_sessions
FROM dba_hist_sysstat s,
dba_hist_snapshot sn
WHERE s.snap_id = sn.snap_id
AND s.stat_name = 'logons current'
AND begin_interval_time > SYSDATE - 30
GROUP BY TRUNC(begin_interval_time)
);
  • Set appropriate minimum/maximum pool sizes
  • Configure connection timeout values
  • Implement connection validation
  • Monitor pool utilization regularly
  • Use connection pooling appropriately
  • Close connections promptly
  • Implement retry logic with backoff
  • Avoid creating excessive concurrent connections
#!/bin/bash
# Emergency session cleanup
sqlplus -s / as sysdba << EOF
-- Kill sessions inactive for more than 2 hours
BEGIN
FOR rec IN (
SELECT sid, serial#
FROM v$session
WHERE status = 'INACTIVE'
AND last_call_et > 7200
AND username IS NOT NULL
) LOOP
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' ||
rec.sid || ',' || rec.serial# || ''' IMMEDIATE';
END LOOP;
END;
/
EOF
-- Emergency parameter increase
ALTER SYSTEM SET sessions=3000 SCOPE=SPFILE;
-- Requires database restart
SHUTDOWN IMMEDIATE;
STARTUP;
  • ORA-00019: Maximum number of session licenses exceeded
  • ORA-12520: TNS listener could not find available handler
  • ORA-12519: TNS no appropriate service handler found
  1. Monitor session usage trends regularly
  2. Set SESSIONS to 20-30% above peak usage
  3. Implement proper connection pooling
  4. Use application-level connection management
  5. Regular cleanup of abandoned sessions
  6. Capacity planning based on growth projections
  • Check current session count vs. limit
  • Identify session types and users
  • Review connection pool configuration
  • Analyze session history trends
  • Kill inactive/abandoned sessions
  • Increase SESSIONS parameter if needed
  • Implement monitoring and alerting
  • Review application connection handling