Skip to content

ORA-12514 TNS Listener Does Not Know of Service - Service Registration Fix

ORA-12514: TNS:Listener Does Not Currently Know of Service Requested

Section titled “ORA-12514: TNS:Listener Does Not Currently Know of Service Requested”

Error Text: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

This error occurs when the Oracle listener receives a connection request for a service that is not registered with it. The listener is running and accessible, but it doesn’t know about the requested service name or SID.

  • Database instance not started
  • Service registration failed
  • Wrong service name in connection string
  • Dynamic registration issues
  • Using SID instead of SERVICE_NAME
  • Incorrect service name in tnsnames.ora
  • Case sensitivity issues
  • Service temporarily unavailable
  • LOCAL_LISTENER parameter incorrect
  • Instance registration delay
  • Network connectivity issues
  • Listener restart cleared registrations
  • Wrong PORT in connection descriptor
  • Multiple listeners on different ports
  • Instance connected to wrong listener
  • SERVICE_NAMES parameter not set
Terminal window
# Check if listener is running
lsnrctl status
# Check registered services
lsnrctl services
# Check listener configuration
cat $TNS_ADMIN/listener.ora
# Show running listeners
ps -ef | grep tnslsnr
-- Connect locally to database
export ORACLE_SID=orcl
sqlplus / as sysdba
-- Check instance status
SELECT instance_name, status, database_status FROM v$instance;
-- Check service registration
SELECT name, network_name FROM v$services;
-- Show all registered services
SELECT inst_id, name, network_name
FROM gv$services
ORDER BY inst_id, name;
-- Check service-related parameters
SHOW PARAMETER service_names;
SHOW PARAMETER db_name;
SHOW PARAMETER db_domain;
SHOW PARAMETER local_listener;
SHOW PARAMETER remote_listener;
-- Check instance registration information
SELECT name, value FROM v$parameter
WHERE name IN ('service_names', 'db_name', 'db_domain',
'local_listener', 'instance_name');
Terminal window
# Test different connection methods
tnsping ORCL
tnsping server:1521/orcl
tnsping server:1521/orcl.domain.com
# Try direct connection
sqlplus user/pass@server:1521/service_name
sqlplus user/pass@server:1521:SID
# Test with full descriptor
sqlplus user/pass@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))"
-- Connect to database as SYSDBA
sqlplus / as sysdba
-- Register with listener manually
ALTER SYSTEM REGISTER;
-- Wait a few seconds, then check
-- lsnrctl services
-- Set service names if not configured
ALTER SYSTEM SET service_names = 'orcl,orcl.domain.com' SCOPE=BOTH;
-- For RAC environments
ALTER SYSTEM SET service_names = 'orcl.domain.com' SCOPE=BOTH;
-- Set local listener parameter
ALTER SYSTEM SET local_listener = 'LISTENER_ORCL' SCOPE=BOTH;
-- Or use default port
ALTER SYSTEM SET local_listener = '' SCOPE=BOTH;
-- For non-standard port
ALTER SYSTEM SET local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1522))' SCOPE=BOTH;
-- Register after changes
ALTER SYSTEM REGISTER;
Terminal window
# Check current entry
cat $TNS_ADMIN/tnsnames.ora
# WRONG - Using SID when SERVICE_NAME expected
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521))
(CONNECT_DATA =
(SID = orcl) # Problem: Using SID
)
)
# CORRECT - Using SERVICE_NAME
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl.domain.com) # Solution: Use SERVICE_NAME
)
)
# Alternative with SERVER=DEDICATED
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.domain.com)
)
)
Terminal window
# Easy connect syntax avoids tnsnames.ora issues
sqlplus user/pass@server:1521/service_name
sqlplus user/[email protected]:1521/orcl.domain.com
# Enable easy connect in sqlnet.ora
echo "NAMES.DIRECTORY_PATH= (EZCONNECT, TNSNAMES)" >> $TNS_ADMIN/sqlnet.ora
Terminal window
# Add to listener.ora for guaranteed registration
# Edit $TNS_ADMIN/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521))
)
)
# Add static service registration
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl.domain.com)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(SID_NAME = orcl)
)
)
# Restart listener
lsnrctl stop
lsnrctl start
Terminal window
# If multiple listeners, ensure correct one is used
# Check all running listeners
lsnrctl status LISTENER
lsnrctl status LISTENER1521
lsnrctl status LISTENER1522
# Verify database is registering with correct listener
sqlplus / as sysdba
SHOW PARAMETER local_listener;
# Set to specific listener
ALTER SYSTEM SET local_listener = 'LISTENER1522' SCOPE=BOTH;
ALTER SYSTEM REGISTER;
-- Create application-specific service
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'MYAPP_SERVICE',
network_name => 'myapp.domain.com'
);
END;
/
-- Start the service
BEGIN
DBMS_SERVICE.START_SERVICE(service_name => 'MYAPP_SERVICE');
END;
/
-- Check service status
SELECT name, network_name, creation_date
FROM dba_services
WHERE name = 'MYAPP_SERVICE';
-- Register with listener
ALTER SYSTEM REGISTER;
-- Monitor service availability
SELECT
inst_id,
name,
network_name,
creation_date,
GOAL,
CLB_GOAL
FROM gv$services
WHERE name NOT LIKE 'SYS%'
ORDER BY inst_id, name;
-- Check service metrics
SELECT
service_name,
stat_name,
value
FROM v$service_stats
WHERE service_name = 'MYAPP_SERVICE';
-- Check registration queue
SELECT * FROM v$listener_network;
-- Force immediate registration
ALTER SYSTEM REGISTER;
-- Check registration delay
-- Registration happens every 60 seconds by default
SHOW PARAMETER local_listener;
-- Monitor registration process
-- Watch alert log during registration:
tail -f $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log
-- Check for errors
SELECT originating_timestamp, message_text
FROM x$dbgalertext
WHERE message_text LIKE '%TNS%'
OR message_text LIKE '%listener%'
ORDER BY originating_timestamp DESC;
Terminal window
# Test network connectivity
telnet server 1521
nc -zv server 1521
# Check if listener is on expected interface
netstat -an | grep 1521
lsof -i :1521
# DNS resolution
nslookup server
ping server
# Check firewall
iptables -L -n | grep 1521
-- Find all available services in database
SELECT
'SERVICE_NAME: ' || name as available_services
FROM v$services
UNION ALL
SELECT
'SID: ' || instance_name
FROM v$instance;
-- Show service history
SELECT service_name, creation_date, network_name
FROM dba_services
ORDER BY creation_date;
-- Check for duplicate services
SELECT name, COUNT(*)
FROM v$services
GROUP BY name
HAVING COUNT(*) > 1;
-- Create service monitoring table
CREATE TABLE service_availability_log (
check_time TIMESTAMP DEFAULT SYSTIMESTAMP,
service_name VARCHAR2(64),
status VARCHAR2(20),
error_message VARCHAR2(500)
);
-- Monitoring procedure
CREATE OR REPLACE PROCEDURE monitor_service_availability AS
v_connection_test NUMBER;
BEGIN
-- Test each service
FOR svc IN (SELECT name FROM v$services WHERE name NOT LIKE 'SYS%') LOOP
BEGIN
-- Try to connect (simplified test)
SELECT 1 INTO v_connection_test FROM dual;
INSERT INTO service_availability_log (
service_name, status
) VALUES (
svc.name, 'AVAILABLE'
);
EXCEPTION
WHEN OTHERS THEN
INSERT INTO service_availability_log (
service_name, status, error_message
) VALUES (
svc.name, 'UNAVAILABLE', SQLERRM
);
END;
END LOOP;
COMMIT;
END;
/
-- Schedule monitoring
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'MONITOR_SERVICES',
job_type => 'STORED_PROCEDURE',
job_action => 'monitor_service_availability',
repeat_interval => 'FREQ=MINUTELY; INTERVAL=5',
enabled => TRUE
);
END;
/
listener_health_check.sh
#!/bin/bash
LOG_FILE="/var/log/oracle/listener_health.log"
echo "$(date): Checking listener health" >> $LOG_FILE
# Check listener status
if lsnrctl status LISTENER > /dev/null 2>&1; then
echo "$(date): Listener is running" >> $LOG_FILE
# Check service registration
SERVICE_COUNT=$(lsnrctl services LISTENER | grep -c "Service ")
echo "$(date): $SERVICE_COUNT services registered" >> $LOG_FILE
if [ $SERVICE_COUNT -eq 0 ]; then
echo "$(date): WARNING: No services registered!" >> $LOG_FILE
# Could trigger alert here
fi
else
echo "$(date): CRITICAL: Listener is not running!" >> $LOG_FILE
# Could trigger restart here
fi
-- Check all instances in RAC
SELECT inst_id, instance_name, status FROM gv$instance;
-- Check service distribution across nodes
SELECT inst_id, name, network_name
FROM gv$services
WHERE name = 'RACDB'
ORDER BY inst_id;
-- Add service to specific instances
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'RACDB_SERVICE',
network_name => 'racdb.domain.com'
);
DBMS_SERVICE.START_SERVICE(
service_name => 'RACDB_SERVICE',
instance_name => 'orcl1'
);
END;
/
-- Check SCAN listener registration
SHOW PARAMETER remote_listener;
-- Should be set to SCAN:PORT
  1. ✓ Database instance is started and OPEN
  2. ✓ SERVICE_NAMES parameter is set correctly
  3. ✓ LOCAL_LISTENER parameter matches listener
  4. ✓ Listener is running on expected port
  5. ✓ Run ALTER SYSTEM REGISTER
  6. ✓ Verify with lsnrctl services
  7. ✓ Test connection with correct service name
  8. ✓ Check for firewall/network issues
Terminal window
# 1. Check listener status
lsnrctl status
# 2. If listener down, start it
lsnrctl start
# 3. Connect to database and register
sqlplus / as sysdba
ALTER SYSTEM REGISTER;
# 4. Verify registration
lsnrctl services
# 5. Test connection
tnsping service_name
# 6. Use alternative connection if needed
sqlplus user/pass@server:1521/service_name
Terminal window
# Standard service connection
sqlplus user/pass@service_name
# Direct service connection
sqlplus user/pass@server:1521/service_name
# SID connection (if service unavailable)
sqlplus user/pass@server:1521:SID
# Full descriptor (troubleshooting)
sqlplus user/pass@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=service)))"