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 Overview
Section titled “Error Overview”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.
Understanding Session Limits
Section titled “Understanding Session Limits”Session Parameters
Section titled “Session Parameters”SESSIONS Parameter├── Default: Derived from PROCESSES parameter├── Formula: (1.1 * PROCESSES) + 5├── Range: 1 to 2147483647└── Scope: Instance-level, requires restart
Related Parameters
Section titled “Related Parameters”- PROCESSES - Maximum OS processes (base for SESSIONS)
- LICENSE_MAX_SESSIONS - Licensed session limit
- LICENSE_SESSIONS_WARNING - Warning threshold
Common Causes
Section titled “Common Causes”Application Issues
Section titled “Application Issues”-- Connection pool exhaustion-- Abandoned connections not closed-- Runaway processes creating multiple sessions-- Poor connection management in applications
Configuration Issues
Section titled “Configuration Issues”- SESSIONS parameter set too low
- Inadequate capacity planning
- License limitations
- Resource constraints
Diagnostic Queries
Section titled “Diagnostic Queries”Current Session Count
Section titled “Current Session Count”-- Check current session usageSELECT '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_percentFROM v$session;
Session Breakdown by Type
Section titled “Session Breakdown by Type”-- Analyze session typesSELECT type, status, COUNT(*) as session_countFROM v$sessionGROUP BY type, statusORDER BY session_count DESC;
Top Session Users
Section titled “Top Session Users”-- Identify heavy session usersSELECT username, machine, program, COUNT(*) as session_count, MIN(logon_time) as oldest_session, MAX(logon_time) as newest_sessionFROM v$sessionWHERE username IS NOT NULLGROUP BY username, machine, programORDER BY session_count DESC;
Session History
Section titled “Session History”-- Check session trends from AWRSELECT snap_id, begin_interval_time, value as sessions_usedFROM dba_hist_sysstat s, dba_hist_snapshot snWHERE s.snap_id = sn.snap_idAND s.stat_name = 'logons current'ORDER BY begin_interval_time DESCFETCH FIRST 24 ROWS ONLY;
Resolution Steps
Section titled “Resolution Steps”Immediate Actions
Section titled “Immediate Actions”1. Kill Inactive Sessions
Section titled “1. Kill Inactive Sessions”-- Find long-running inactive sessionsSELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;' as kill_commandFROM v$sessionWHERE status = 'INACTIVE'AND last_call_et > 3600 -- Inactive for more than 1 hourAND username IS NOT NULL;
2. Increase SESSIONS Parameter
Section titled “2. Increase SESSIONS Parameter”-- Check current valueSELECT name, value, isdefaultFROM v$parameterWHERE name IN ('sessions', 'processes');
-- Increase sessions (requires restart)ALTER SYSTEM SET sessions=2000 SCOPE=SPFILE;
Long-term Solutions
Section titled “Long-term Solutions”1. Connection Pool Configuration
Section titled “1. Connection Pool Configuration”-- Monitor connection pool efficiencySELECT machine, program, COUNT(*) as connections, COUNT(DISTINCT username) as unique_users, ROUND(COUNT(*) / COUNT(DISTINCT username), 2) as connections_per_userFROM v$sessionWHERE username IS NOT NULLGROUP BY machine, programHAVING COUNT(*) > 10ORDER BY connections DESC;
2. Application Connection Management
Section titled “2. Application Connection Management”// Example: Proper connection handling in Javatry (Connection conn = DriverManager.getConnection(url, user, pass)) { // Use connection} catch (SQLException e) { // Handle error} // Connection automatically closed
3. Session Monitoring Script
Section titled “3. Session Monitoring Script”-- Create monitoring viewCREATE OR REPLACE VIEW session_monitor ASSELECT 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 statusFROM v$session;
Prevention Strategies
Section titled “Prevention Strategies”Capacity Planning
Section titled “Capacity Planning”-- Calculate recommended SESSIONS valueSELECT 'Recommended SESSIONS' as parameter, GREATEST( ROUND(MAX(daily_sessions) * 1.5), -- 50% headroom 500 -- Minimum recommendation ) as recommended_valueFROM ( 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));
Connection Pool Best Practices
Section titled “Connection Pool Best Practices”- Set appropriate minimum/maximum pool sizes
- Configure connection timeout values
- Implement connection validation
- Monitor pool utilization regularly
Application Design
Section titled “Application Design”- Use connection pooling appropriately
- Close connections promptly
- Implement retry logic with backoff
- Avoid creating excessive concurrent connections
Emergency Procedures
Section titled “Emergency Procedures”Session Cleanup Script
Section titled “Session Cleanup Script”#!/bin/bash# Emergency session cleanupsqlplus -s / as sysdba << EOF-- Kill sessions inactive for more than 2 hoursBEGIN 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
Parameter Adjustment
Section titled “Parameter Adjustment”-- Emergency parameter increaseALTER SYSTEM SET sessions=3000 SCOPE=SPFILE;-- Requires database restartSHUTDOWN IMMEDIATE;STARTUP;
Related Errors
Section titled “Related Errors”- 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
Best Practices
Section titled “Best Practices”- Monitor session usage trends regularly
- Set SESSIONS to 20-30% above peak usage
- Implement proper connection pooling
- Use application-level connection management
- Regular cleanup of abandoned sessions
- Capacity planning based on growth projections
Troubleshooting Checklist
Section titled “Troubleshooting Checklist”- 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