ORA-12170 TNS Connect Timeout - Complete Resolution Guide
ORA-12170: TNS:Connect Timeout Occurred
Section titled “ORA-12170: TNS:Connect Timeout Occurred”Error Overview
Section titled “Error Overview”Error Text: ORA-12170: TNS:Connect timeout occurred
The ORA-12170 error occurs when an Oracle client cannot establish a connection to the database server within the specified timeout period. This typically indicates network connectivity issues, firewall restrictions, or server unavailability. It’s one of the most common connectivity errors encountered in Oracle environments.
Common Causes
Section titled “Common Causes”1. Network Connectivity Issues
Section titled “1. Network Connectivity Issues”- Network path between client and server is down
- Routing problems or network congestion
- VPN connection issues
- DNS resolution failures
2. Firewall Blocking
Section titled “2. Firewall Blocking”- Firewall blocking Oracle listener port (typically 1521)
- Security group rules in cloud environments
- Network ACLs restricting traffic
3. Server-Side Issues
Section titled “3. Server-Side Issues”- Oracle listener not running
- Database server is down or unreachable
- Listener overloaded with connections
- Wrong port or host configuration
4. Client Configuration Problems
Section titled “4. Client Configuration Problems”- Incorrect tnsnames.ora entries
- Wrong hostname or IP address
- Invalid port number
- SQLNET.ORA timeout settings too low
Diagnostic Steps
Section titled “Diagnostic Steps”Step 1: Basic Network Connectivity
Section titled “Step 1: Basic Network Connectivity”# Test basic network connectivityping database-server-hostname
# Test specific port connectivity# Linux/Macnc -zv database-server-hostname 1521
# Windows (PowerShell)Test-NetConnection -ComputerName database-server-hostname -Port 1521
# Alternative: telnettelnet database-server-hostname 1521Step 2: DNS Resolution
Section titled “Step 2: DNS Resolution”# Verify DNS resolutionnslookup database-server-hostname
# Check /etc/hosts if using local resolutioncat /etc/hosts | grep database-server
# Windowsipconfig /displaydnsStep 3: Check Oracle Listener (Server-Side)
Section titled “Step 3: Check Oracle Listener (Server-Side)”# Check listener statuslsnrctl status
# Check listener on specific portlsnrctl status LISTENER_1521
# Check if listener process is runningps -ef | grep tnslsnr # Linuxtasklist | findstr tnslsnr # WindowsStep 4: Verify TNS Configuration (Client-Side)
Section titled “Step 4: Verify TNS Configuration (Client-Side)”# Test TNS name resolutiontnsping SERVICE_NAME
# Check tnsnames.ora locationecho $TNS_ADMIN # Linuxecho %TNS_ADMIN% # Windows
# View tnsnames.ora contentcat $TNS_ADMIN/tnsnames.oraResolution Steps
Section titled “Resolution Steps”1. Fix Network Connectivity
Section titled “1. Fix Network Connectivity”# Verify route to database servertraceroute database-server-hostname # Linux/Mactracert database-server-hostname # Windows
# Check for packet lossping -c 100 database-server-hostname | grep loss
# Verify firewall isn't blocking (Linux)sudo iptables -L -n | grep 1521
# Check Windows Firewallnetsh advfirewall firewall show rule name=all | findstr 15212. Verify and Fix tnsnames.ora
Section titled “2. Verify and Fix tnsnames.ora”# Correct tnsnames.ora entry formatMYDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = mydb.example.com) ) )
# Common issues to check:# - Typos in hostname# - Wrong port number# - Incorrect SERVICE_NAME vs SID# - Missing closing parentheses# - Extra spaces or hidden characters3. Adjust Timeout Settings
Section titled “3. Adjust Timeout Settings”# sqlnet.ora - Increase connection timeout# Location: $TNS_ADMIN/sqlnet.ora or $ORACLE_HOME/network/admin/sqlnet.ora
# TCP connection timeout (seconds)SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
# Total connection establishment timeoutSQLNET.INBOUND_CONNECT_TIMEOUT = 60
# Send timeout for established connectionsSQLNET.SEND_TIMEOUT = 60
# Receive timeout for established connectionsSQLNET.RECV_TIMEOUT = 604. Start/Restart Oracle Listener
Section titled “4. Start/Restart Oracle Listener”# Stop listenerlsnrctl stop
# Start listenerlsnrctl start
# Reload listener configuration (without restart)lsnrctl reload
# Check listener log for errorstail -100 $ORACLE_BASE/diag/tnslsnr/$(hostname)/listener/trace/listener.log5. Firewall Configuration
Section titled “5. Firewall Configuration”# Linux - Allow Oracle port through firewallsudo firewall-cmd --permanent --add-port=1521/tcpsudo firewall-cmd --reload
# Or using iptablessudo iptables -A INPUT -p tcp --dport 1521 -j ACCEPTsudo iptables -A OUTPUT -p tcp --sport 1521 -j ACCEPT
# AWS Security Group (via AWS CLI)aws ec2 authorize-security-group-ingress \ --group-id sg-xxxxxxxxx \ --protocol tcp \ --port 1521 \ --cidr 10.0.0.0/8Cloud-Specific Solutions
Section titled “Cloud-Specific Solutions”AWS RDS/EC2
Section titled “AWS RDS/EC2”# Check Security Group rulesaws ec2 describe-security-groups --group-ids sg-xxxxxxxxx
# Check Network ACLsaws ec2 describe-network-acls --network-acl-ids acl-xxxxxxxxx
# Verify RDS endpointaws rds describe-db-instances --db-instance-identifier mydb \ --query 'DBInstances[0].Endpoint'# Check NSG rulesaz network nsg rule list --nsg-name myNSG --resource-group myRG
# Verify database endpointaz sql server show --name myserver --resource-group myRG \ --query fullyQualifiedDomainNameOracle Cloud (OCI)
Section titled “Oracle Cloud (OCI)”# Check Security Listoci network security-list get --security-list-id ocid1.securitylist...
# Verify DB System endpointoci db system get --db-system-id ocid1.dbsystem... \ --query 'data.hostname'Diagnostic Queries (When Connected)
Section titled “Diagnostic Queries (When Connected)”Check Listener Registration
Section titled “Check Listener Registration”-- Check registered servicesSELECT inst_id, service_name, network_nameFROM gv$active_servicesORDER BY inst_id, service_name;
-- Check listener endpointsSELECT * FROM v$listener_network;
-- Check database service registrationSELECT name, network_name, creation_date, pdbFROM v$services;Monitor Connection Statistics
Section titled “Monitor Connection Statistics”-- Current connection countSELECT COUNT(*) as current_connectionsFROM v$sessionWHERE type = 'USER';
-- Connection history (if AWR enabled)SELECT snap_id, stat_name, valueFROM dba_hist_sysstatWHERE stat_name LIKE '%logon%'ORDER BY snap_id DESCFETCH FIRST 10 ROWS ONLY;
-- Check for connection stormsSELECT machine, COUNT(*) as connection_countFROM v$sessionGROUP BY machineORDER BY connection_count DESC;Timeout Configuration Reference
Section titled “Timeout Configuration Reference”Client-Side (sqlnet.ora)
Section titled “Client-Side (sqlnet.ora)”| Parameter | Description | Recommended |
|---|---|---|
| SQLNET.OUTBOUND_CONNECT_TIMEOUT | Initial TCP connection timeout | 30-60 seconds |
| SQLNET.INBOUND_CONNECT_TIMEOUT | Server-side accept timeout | 60 seconds |
| SQLNET.SEND_TIMEOUT | Data send timeout | 60 seconds |
| SQLNET.RECV_TIMEOUT | Data receive timeout | 60 seconds |
Server-Side (listener.ora)
Section titled “Server-Side (listener.ora)”# listener.ora timeout settingsLISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521)) ) )
# Connection timeoutINBOUND_CONNECT_TIMEOUT_LISTENER = 60
# Logging and tracingLOGGING_LISTENER = ONTRACE_LEVEL_LISTENER = OFFTroubleshooting Checklist
Section titled “Troubleshooting Checklist”Network Layer
Section titled “Network Layer”- Can ping database server
- Can reach port 1521 (or configured port)
- DNS resolves correctly
- No firewall blocking
- VPN connected (if required)
Server Layer
Section titled “Server Layer”- Listener is running
- Database is open
- Service is registered with listener
- Listener log shows no errors
Client Layer
Section titled “Client Layer”- tnsnames.ora is correct
- TNS_ADMIN points to right location
- tnsping succeeds
- sqlnet.ora timeouts appropriate
Prevention Strategies
Section titled “Prevention Strategies”1. Connection Pool Configuration
Section titled “1. Connection Pool Configuration”-- Use connection pooling to reduce connection overhead-- Example: Oracle DRCP (Database Resident Connection Pooling)
-- Enable DRCPEXEC DBMS_CONNECTION_POOL.START_POOL();
-- Configure poolEXEC DBMS_CONNECTION_POOL.ALTER_PARAM('', 'MAX_CONNECTIONS_PER_SHARD', '20');EXEC DBMS_CONNECTION_POOL.ALTER_PARAM('', 'MAX_SESSIONS', '500');2. Monitoring Setup
Section titled “2. Monitoring Setup”-- Create monitoring for connection issuesCREATE OR REPLACE PROCEDURE check_listener_health AS v_count NUMBER;BEGIN SELECT COUNT(*) INTO v_count FROM v$session WHERE status = 'ACTIVE' AND event LIKE '%listener%';
IF v_count > 10 THEN -- Send alert DBMS_OUTPUT.PUT_LINE('WARNING: Multiple sessions waiting on listener'); END IF;END;/3. Load Balancer Health Checks
Section titled “3. Load Balancer Health Checks”# tnsnames.ora with multiple addresses for failoverMYDB = (DESCRIPTION = (LOAD_BALANCE = ON) (FAILOVER = ON) (ADDRESS = (PROTOCOL = TCP)(HOST = db1.example.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = db2.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = mydb) ) )Related Errors
Section titled “Related Errors”- ORA-12541 - TNS:no listener
- ORA-12514 - TNS:listener does not currently know of service
- ORA-12154 - TNS:could not resolve the connect identifier
- ORA-12547 - TNS:lost contact
- ORA-03113 - End-of-file on communication channel
Emergency Response
Section titled “Emergency Response”Quick Diagnostics
Section titled “Quick Diagnostics”# Quick connectivity test script#!/bin/bashHOST="database-server"PORT=1521
echo "=== Network Test ==="ping -c 3 $HOST
echo "=== Port Test ==="nc -zv $HOST $PORT 2>&1
echo "=== TNS Test ==="tnsping SERVICENAME
echo "=== DNS Test ==="nslookup $HOSTWhen All Else Fails
Section titled “When All Else Fails”- Check if server is up - Contact server/cloud team
- Check recent changes - Network, firewall, or security updates
- Review listener log - Look for rejection messages
- Try alternate connection - Use IP instead of hostname
- Escalate - Involve network team if network layer issue confirmed