Skip to content

ORA-12560: TNS Protocol Adapter Error

ORA-12560 occurs when the Oracle client cannot establish a connection to the Oracle database due to TNS (Transparent Network Substrate) protocol adapter issues. This error typically indicates problems with Oracle services, listeners, or network configuration.

ORA-12560: TNS:protocol adapter error

🟡 HIGH - Prevents database connections but doesn’t affect running sessions.

  • Oracle database instance is down
  • Oracle listener service is stopped
  • Required Windows services not started
  • ORACLE_HOME not set correctly
  • ORACLE_SID not configured
  • PATH missing Oracle binaries
  • Listener configuration issues
  • TNS configuration problems
  • Firewall blocking connections
  • Oracle user lacks proper permissions
  • File permission problems
  • Registry issues (Windows)
Terminal window
# Check Oracle services status
services.msc
# Or via command line
sc query | findstr /i oracle
# Check specific Oracle services
sc query OracleServiceORCL
sc query OracleOraDB19Home1TNSListener
  • OracleServiceORCL (or your SID name)
  • OracleOraDB19Home1TNSListener
  • OracleVssWriterORCL (if using VSS)
Terminal window
# Check if Oracle processes are running
ps -ef | grep oracle | grep -v grep
# Check specific processes
ps -ef | grep pmon | grep -v grep
ps -ef | grep tnslsnr | grep -v grep
# Check listener status
lsnrctl status
Terminal window
# Verify environment variables
echo $ORACLE_HOME
echo $ORACLE_SID
echo $PATH | grep oracle
# Check if Oracle is in PATH
which sqlplus
which lsnrctl
-- Try connecting locally without TNS
sqlplus / as sysdba
-- If successful, try with SID
sqlplus system/password@localhost:1521/ORCL
-- Test basic connection
sqlplus system/password
Terminal window
# Check listener status
lsnrctl status
# Check listener services
lsnrctl services
# Check listener log for errors
tail -f $ORACLE_HOME/network/log/listener.log
Terminal window
# Check tnsnames.ora exists and is readable
ls -l $ORACLE_HOME/network/admin/tnsnames.ora
# Test TNS resolution
tnsping ORCL
# Check TNS configuration
cat $ORACLE_HOME/network/admin/tnsnames.ora
Terminal window
# Start Oracle database service
net start OracleServiceORCL
# Start Oracle listener
net start OracleOraDB19Home1TNSListener
# Or use Services control panel
services.msc
Terminal window
# Set Oracle environment variables
set ORACLE_HOME=C:\app\oracle\product\19c\dbhome_1
set ORACLE_SID=ORCL
set PATH=%ORACLE_HOME%\bin;%PATH%
# Make permanent via System Properties -> Advanced -> Environment Variables
Terminal window
# Check Oracle registry entries
regedit
# Navigate to: HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
# Verify ORACLE_HOME and other paths are correct
Terminal window
# Set environment
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
# Start database
sqlplus / as sysdba
SQL> startup
# Start listener
lsnrctl start
Terminal window
# Add to .bash_profile or .bashrc
cat >> ~/.bash_profile << 'EOF'
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
EOF
# Reload environment
source ~/.bash_profile
Terminal window
# Check listener configuration
cat $ORACLE_HOME/network/admin/listener.ora
# Example correct listener.ora
cat > $ORACLE_HOME/network/admin/listener.ora << 'EOF'
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ORCL)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
)
)
EOF
Terminal window
# Example correct tnsnames.ora
cat > $ORACLE_HOME/network/admin/tnsnames.ora << 'EOF'
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
EOF
Terminal window
# Stop and start listener
lsnrctl stop
lsnrctl start
# Verify listener is working
lsnrctl status
tnsping ORCL
Terminal window
# Set trace parameters (in sqlnet.ora or environment)
export TNS_ADMIN=$ORACLE_HOME/network/admin
# Add to sqlnet.ora
cat >> $ORACLE_HOME/network/admin/sqlnet.ora << 'EOF'
TRACE_LEVEL_CLIENT = 16
TRACE_FILE_CLIENT = client_trace
TRACE_DIRECTORY_CLIENT = /tmp
EOF
# Attempt connection and check trace files
ls -l /tmp/*trace*
Terminal window
# Test port connectivity
telnet localhost 1521
nc -zv localhost 1521
# Check if port is listening
netstat -an | grep 1521
lsof -i :1521
# Check firewall (Linux)
iptables -L | grep 1521
firewall-cmd --list-ports
-- Connect locally and check status
sqlplus / as sysdba
-- Check database status
SELECT status FROM v$instance;
-- Check listener registration
SELECT name, value FROM v$parameter WHERE name = 'local_listener';
-- Force listener registration
ALTER SYSTEM REGISTER;
Terminal window
# After Oracle installation, ensure these steps:
# 1. Set environment variables
# 2. Create database (if not done)
# 3. Start listener
# 4. Test connection
# Quick setup script
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
# Start database
echo "startup" | sqlplus / as sysdba
# Start listener
lsnrctl start
# Test connection
tnsping ORCL
Terminal window
# Services may not auto-start
# Check and start required services
# Linux - check if services are enabled
systemctl status oracle-database
systemctl status oracle-listener
# Windows - check service startup type
sc config OracleServiceORCL start=auto
sc config OracleOraDB19Home1TNSListener start=auto
Terminal window
# When connecting from remote client:
# 1. Verify network connectivity
ping oracle_server
# 2. Test port connectivity
telnet oracle_server 1521
# 3. Check client TNS configuration
tnsping REMOTE_ORCL
# 4. Verify server listener accepts remote connections
lsnrctl status
Terminal window
# Create startup scripts for automatic service start
# Linux systemd service example
cat > /etc/systemd/system/oracle-database.service << 'EOF'
[Unit]
Description=Oracle Database Service
After=network.target
[Service]
Type=forking
User=oracle
Environment=ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
Environment=ORACLE_SID=ORCL
ExecStart=/u01/app/oracle/product/19c/dbhome_1/bin/dbstart
ExecStop=/u01/app/oracle/product/19c/dbhome_1/bin/dbshut
[Install]
WantedBy=multi-user.target
EOF
systemctl enable oracle-database
Terminal window
# Create Oracle environment script
cat > /etc/profile.d/oracle.sh << 'EOF'
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
EOF
connection_test.sh
-- Create monitoring script for connection testing
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
# Test connection
if ! echo "SELECT 1 FROM DUAL;" | sqlplus -s system/password > /dev/null 2>&1; then
echo "ALERT: Oracle connection failed - $(date)"
# Send alert notification
fi
Terminal window
# Essential troubleshooting commands
ps -ef | grep oracle # Check Oracle processes
lsnrctl status # Check listener status
tnsping <service_name> # Test TNS resolution
sqlplus / as sysdba # Test local connection
netstat -an | grep 1521 # Check port listening
Terminal window
# Quick recovery steps
lsnrctl stop && lsnrctl start # Restart listener
echo "startup" | sqlplus / as sysdba # Start database
tnsping ORCL # Verify connectivity

This error is often the first sign of connection issues and can usually be resolved by ensuring Oracle services are running and properly configured. Always start with the basics: check if Oracle is running, then verify network configuration.