Skip to content

Oracle Net Services - Complete Connectivity Guide

Oracle Net Services is Oracle’s communication software that enables network sessions between client applications and Oracle databases. It provides location transparency, centralized configuration, and scalable connectivity solutions for Oracle environments.

Oracle Net Services provides:

  • Transparent network connectivity between clients and databases
  • Location transparency - clients don’t need to know database location
  • Load balancing and failover capabilities
  • Connection pooling and multiplexing for scalability
  • Security features including encryption and authentication
  • Centralized configuration management
Client Application
↓
Oracle Net (Client)
↓
Network (TCP/IP)
↓
Oracle Net (Server)
↓
Oracle Listener
↓
Oracle Database
Terminal window
# Sample listener.ora file
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1.company.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = MYDB)
(ORACLE_HOME = /u01/oracle/product/19c)
(PROGRAM = oracle)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle/product/19c)
(PROGRAM = extproc)
)
)
# Advanced settings
LOGGING_LISTENER = ON
TRACE_LEVEL_LISTENER = OFF
INBOUND_CONNECT_TIMEOUT_LISTENER = 60
Terminal window
# Multiple listeners on same server
LISTENER1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
)
LISTENER2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1522))
)
# Different service listeners
PROD_LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = prodserver)(PORT = 1521))
)
TEST_LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = testserver)(PORT = 1522))
)
Terminal window
# Start listener
lsnrctl start LISTENER
# Stop listener
lsnrctl stop LISTENER
# Check listener status
lsnrctl status LISTENER
# Reload listener configuration
lsnrctl reload LISTENER
# Show listener services
lsnrctl services LISTENER
# Show listener version
lsnrctl version
# Trace listener activity
lsnrctl trace LISTENER admin
# Set listener password
lsnrctl set password
Terminal window
# Dynamic service registration status
lsnrctl services LISTENER
# Show listener statistics
lsnrctl status LISTENER -detail
# Enable/disable service
lsnrctl set service_registration on
lsnrctl set service_registration off
# Show current parameters
lsnrctl show LISTENER
# Save configuration
lsnrctl save_config LISTENER
# Listener log management
lsnrctl set log_status on
lsnrctl set log_file /u01/oracle/network/log/listener.log
Terminal window
# Basic connection descriptor
MYDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1.company.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb.company.com)
)
)
# Connection with failover
MYDB_HA =
(DESCRIPTION =
(ADDRESS_LIST =
(FAILOVER = ON)
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = server2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 3)
(DELAY = 10)
)
)
)
# RAC connection
RAC_DB =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac3-vip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb.company.com)
)
)
Terminal window
# Connection with retry and timeout
ROBUST_DB =
(DESCRIPTION =
(RETRY_COUNT = 3)
(RETRY_DELAY = 10)
(TRANSPORT_CONNECT_TIMEOUT = 60)
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
(SERVER = DEDICATED)
)
)
# SSL/TLS encrypted connection
SECURE_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = secure-server)(PORT = 2484))
(CONNECT_DATA =
(SERVICE_NAME = securedb.company.com)
)
(SECURITY =
(SSL_SERVER_CERT_DN = "CN=secure-server,O=Company,C=US")
)
)
# Connection pooling
POOLED_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
(SERVER = POOLED)
)
)
Terminal window
# Test TNS connectivity
tnsping MYDB
# Test with count
tnsping MYDB 5
# Detailed testing
sqlplus system/password@MYDB
# Test specific service
tnsping MYDB.company.com
# Test from different host
tnsping MYDB 10 | grep -E "(OK|TNS-)"
Terminal window
# Enable TNS tracing (sqlnet.ora)
TRACE_LEVEL_CLIENT = 16
TRACE_DIRECTORY_CLIENT = /u01/oracle/network/trace
TRACE_FILE_CLIENT = client
TRACE_UNIQUE_CLIENT = ON
# Server-side tracing
TRACE_LEVEL_SERVER = 16
TRACE_DIRECTORY_SERVER = /u01/oracle/network/trace
TRACE_FILE_SERVER = server
# Listener tracing
lsnrctl set trc_level 16
lsnrctl set trc_file /u01/oracle/network/trace/listener.trc
Terminal window
# Dedicated connection in tnsnames.ora
DEDICATED_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
(SERVER = DEDICATED)
)
)
# Check dedicated processes
SQL> SELECT program, count(*)
FROM v$process
WHERE program LIKE '%oracle@%'
GROUP BY program;
Terminal window
# Shared server configuration (init.ora)
DISPATCHERS="(PROTOCOL=TCP)(DISPATCHERS=3)"
SHARED_SERVERS=5
MAX_SHARED_SERVERS=20
SHARED_SERVER_SESSIONS=50
# Shared connection descriptor
SHARED_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
(SERVER = SHARED)
)
)
# Monitor shared server
SQL> SELECT * FROM v$dispatcher;
SQL> SELECT * FROM v$shared_server;
SQL> SELECT * FROM v$queue;
Terminal window
# Connection pooling parameters
CONNECTION_POOLING = ON
POOL_SIZE = 10
POOL_INCREMENT = 2
POOL_DECREMENT = 1
POOL_TIMEOUT = 300
# Monitor connection pools
SQL> SELECT pool_name, status, sessions, max_sessions
FROM v$cpool_stats;
-- Current sessions
SELECT username, program, machine, status, logon_time
FROM v$session
WHERE type = 'USER'
ORDER BY logon_time;
-- Connection details
SELECT s.username, s.program, s.machine,
p.program as process_name,
s.server as connection_type
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.type = 'USER';
-- Network statistics
SELECT name, value
FROM v$sysstat
WHERE name LIKE '%Net%'
OR name LIKE '%SQL*Net%';
-- Check session limits
SELECT resource_name, current_utilization, max_utilization, limit_value
FROM v$resource_limit
WHERE resource_name IN ('sessions', 'processes');
-- Session resource usage
SELECT username, program,
logical_reads_session,
physical_reads_session,
cpu_used_by_this_session
FROM v$sesstat s, v$statname n, v$session ses
WHERE s.statistic# = n.statistic#
AND s.sid = ses.sid
AND n.name IN ('session logical reads',
'session physical reads',
'CPU used by this session')
AND ses.username IS NOT NULL;
Terminal window
# SQLNet.ora encryption settings
SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128, 3DES168)
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128, 3DES168)
# Checksumming for data integrity
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA256, SHA1, MD5)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1, MD5)
Terminal window
# SSL wallet configuration
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/oracle/network/admin/wallet)
)
)
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA)
# Listener SSL configuration
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = server1)(PORT = 2484))
)
SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION = /u01/oracle/network/admin/wallet
Terminal window
# Valid node checking
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (server1, server2, client1, client2)
TCP.EXCLUDED_NODES = (hacker*, *.untrusted.com)
# Connection rate limiting
CONNECTION_RATE_LISTENER = 10
INBOUND_CONNECT_TIMEOUT_LISTENER = 10
# Logging and auditing
LOGGING_LISTENER = ON
LOG_STATUS_LISTENER = ON
ADMIN_RESTRICTIONS_LISTENER = ON
Terminal window
# Standard database authentication
MYDB_AUTH =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
)
)
# Connection: sqlplus username/password@MYDB_AUTH
Terminal window
# OS Authentication
SQLNET.AUTHENTICATION_SERVICES = (NTS) # Windows
SQLNET.AUTHENTICATION_SERVICES = (BEQ) # Unix/Linux
# Kerberos authentication
SQLNET.AUTHENTICATION_SERVICES = (KERBEROS5)
SQLNET.KERBEROS5_CONF = /etc/krb5.conf
SQLNET.KERBEROS5_REALMS = /etc/krb5.realms
Terminal window
# Optimal pooling parameters
CONNECTION_POOLING = ON
POOL_SIZE = 20
POOL_INCREMENT = 5
POOL_DECREMENT = 2
POOL_TIMEOUT = 300
POOL_MAX_LIFETIME = 3600
# Monitor pool efficiency
SQL> SELECT pool_name, opened_connections, closed_connections,
pool_hits, pool_misses
FROM v$cpool_stats;
Terminal window
# SDU (Session Data Unit) optimization
DEFAULT_SDU_SIZE = 8192
MAX_SDU_SIZE = 32767
# Disable Nagle algorithm for low latency
TCP.NODELAY = YES
# Socket buffer sizes
RECV_BUF_SIZE = 65536
SEND_BUF_SIZE = 65536
# Connection multiplexing
USE_SHARED_SOCKET = TRUE
Terminal window
# Random load balancing
BALANCED_DB =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = server2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = server3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
)
)
-- Configure service with load balancing
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'BALANCED_SERVICE',
network_name => 'balanced.company.com',
goal => DBMS_SERVICE.GOAL_THROUGHPUT,
clb_goal => DBMS_SERVICE.CLB_GOAL_SHORT
);
DBMS_SERVICE.START_SERVICE(
service_name => 'BALANCED_SERVICE'
);
END;
/
-- Monitor service metrics
SELECT service_name, goal, clb_goal, aq_ha_notifications
FROM dba_services;
Terminal window
# TAF configuration
TAF_DB =
(DESCRIPTION =
(ADDRESS_LIST =
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
# Session failover
SESSION_TAF_DB =
(DESCRIPTION =
(ADDRESS_LIST =
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
(FAILOVER_MODE =
(TYPE = SESSION)
(METHOD = BASIC)
)
)
)
-- Network statistics
SELECT name, value
FROM v$sysstat
WHERE name LIKE '%Net%'
OR name LIKE '%SQL*Net%'
ORDER BY name;
-- Session network I/O
SELECT s.username, s.program,
n1.value as bytes_sent,
n2.value as bytes_received
FROM v$session s, v$sesstat n1, v$sesstat n2, v$statname sn1, v$statname sn2
WHERE s.sid = n1.sid
AND s.sid = n2.sid
AND n1.statistic# = sn1.statistic#
AND n2.statistic# = sn2.statistic#
AND sn1.name = 'bytes sent via SQL*Net to client'
AND sn2.name = 'bytes received via SQL*Net from client'
AND s.username IS NOT NULL;
-- Listener statistics
SELECT * FROM v$listener_network;
-- Response times
SELECT service_name,
calls_per_sec,
average_response_time,
total_cpu_time
FROM v$service_stats;
-- Wait events
SELECT event, total_waits, total_timeouts, time_waited
FROM v$system_event
WHERE event LIKE '%Net%'
OR event LIKE '%SQL*Net%'
ORDER BY time_waited DESC;
Terminal window
# TNS resolution issues
tnsping MYDB
nslookup server1.company.com
telnet server1 1521
# Listener issues
lsnrctl status
lsnrctl services
ps -ef | grep tnslsnr
# Firewall/network issues
telnet server1 1521
netstat -an | grep 1521
iptables -L | grep 1521
Terminal window
# Common TNS errors and solutions
# TNS-12541: TNS:no listener
# - Check if listener is running
# - Verify hostname/port in tnsnames.ora
lsnrctl status
lsnrctl start
# TNS-12154: TNS:could not resolve the connect identifier
# - Check tnsnames.ora syntax
# - Verify ORACLE_HOME/network/admin path
tnsping MYDB
# ORA-12519: TNS:no appropriate service handler found
# - Check processes/sessions limits
# - Verify service registration
SQL> SHOW PARAMETER processes;
SQL> ALTER SYSTEM SET processes=300 SCOPE=SPFILE;
# ORA-12514: TNS:listener does not currently know of service
# - Check service registration
# - Verify database is open
lsnrctl services
SQL> SELECT name, open_mode FROM v$database;
Terminal window
# Network latency testing
time tnsping MYDB
# Connection time analysis
time sqlplus system/password@MYDB <<< "exit"
# Trace network issues
# Set in sqlnet.ora:
TRACE_LEVEL_CLIENT = 16
TRACE_DIRECTORY_CLIENT = /tmp
# Analyze trace files
grep -i error /tmp/client*.trc
grep -i "elapsed time" /tmp/client*.trc
Terminal window
# Connection Manager configuration
CMAN =
(CONFIGURATION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cman-server)(PORT = 1521))
(PARAMETER_LIST =
(MAX_GATEWAY_PROCESSES = 8)
(MIN_GATEWAY_PROCESSES = 2)
)
)
# Client connection through CMAN
CMAN_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cman-server)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = mydb.company.com)
)
)
Terminal window
# LDAP configuration (ldap.ora)
DEFAULT_ADMIN_CONTEXT = "cn=OracleContext,dc=company,dc=com"
DIRECTORY_SERVERS = (ldap-server1:389, ldap-server2:389)
DIRECTORY_SERVER_TYPE = OID
# Using directory naming
NAMES.DIRECTORY_PATH = (LDAP, TNSNAMES, HOSTNAME)
NAMES.DEFAULT_DOMAIN = company.com
Terminal window
# FCF with RAC
FCF_RAC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb.company.com)
(FAST_CONNECTION_FAILOVER = ON)
)
)
# Enable FCF notifications
SQL> ALTER SYSTEM SET aq_tm_processes=1;
Terminal window
# GDS broker configuration
GDSCTL> add broker gdsbroker1 -connect server1:1522
GDSCTL> add broker gdsbroker2 -connect server2:1522
# Create GDS configuration
GDSCTL> create gdsconfiguration -gdsname mygds
GDSCTL> add service -service sales_svc -gdspool sales_pool
GDSCTL> start service -service sales_svc

Oracle Net Services provides the foundation for scalable, secure, and highly available Oracle database connectivity. Proper configuration and monitoring ensure optimal performance and reliability for enterprise applications.