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 Overview
Section titled “Error Overview”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.
Common Causes
Section titled “Common Causes”1. Service Not Registered
Section titled “1. Service Not Registered”- Database instance not started
- Service registration failed
- Wrong service name in connection string
- Dynamic registration issues
2. Service Name Mismatch
Section titled “2. Service Name Mismatch”- Using SID instead of SERVICE_NAME
- Incorrect service name in tnsnames.ora
- Case sensitivity issues
- Service temporarily unavailable
3. Dynamic Registration Problems
Section titled “3. Dynamic Registration Problems”- LOCAL_LISTENER parameter incorrect
- Instance registration delay
- Network connectivity issues
- Listener restart cleared registrations
4. Configuration Issues
Section titled “4. Configuration Issues”- Wrong PORT in connection descriptor
- Multiple listeners on different ports
- Instance connected to wrong listener
- SERVICE_NAMES parameter not set
Diagnostic Steps
Section titled “Diagnostic Steps”1. Check Listener Status
Section titled “1. Check Listener Status”# Check if listener is runninglsnrctl status
# Check registered serviceslsnrctl services
# Check listener configurationcat $TNS_ADMIN/listener.ora
# Show running listenersps -ef | grep tnslsnr
2. Verify Database Instance
Section titled “2. Verify Database Instance”-- Connect locally to databaseexport ORACLE_SID=orclsqlplus / as sysdba
-- Check instance statusSELECT instance_name, status, database_status FROM v$instance;
-- Check service registrationSELECT name, network_name FROM v$services;
-- Show all registered servicesSELECT inst_id, name, network_nameFROM gv$servicesORDER BY inst_id, name;
3. Check Service Parameters
Section titled “3. Check Service Parameters”-- Check service-related parametersSHOW PARAMETER service_names;SHOW PARAMETER db_name;SHOW PARAMETER db_domain;SHOW PARAMETER local_listener;SHOW PARAMETER remote_listener;
-- Check instance registration informationSELECT name, value FROM v$parameterWHERE name IN ('service_names', 'db_name', 'db_domain', 'local_listener', 'instance_name');
4. Test Connectivity Methods
Section titled “4. Test Connectivity Methods”# Test different connection methodstnsping ORCLtnsping server:1521/orcltnsping server:1521/orcl.domain.com
# Try direct connectionsqlplus user/pass@server:1521/service_namesqlplus user/pass@server:1521:SID
# Test with full descriptorsqlplus user/pass@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))"
Resolution Steps
Section titled “Resolution Steps”Solution 1: Fix Service Registration
Section titled “Solution 1: Fix Service Registration”Manual Service Registration
Section titled “Manual Service Registration”-- Connect to database as SYSDBAsqlplus / as sysdba
-- Register with listener manuallyALTER SYSTEM REGISTER;
-- Wait a few seconds, then check-- lsnrctl services
-- Set service names if not configuredALTER SYSTEM SET service_names = 'orcl,orcl.domain.com' SCOPE=BOTH;
-- For RAC environmentsALTER SYSTEM SET service_names = 'orcl.domain.com' SCOPE=BOTH;
Configure Local Listener
Section titled “Configure Local Listener”-- Set local listener parameterALTER SYSTEM SET local_listener = 'LISTENER_ORCL' SCOPE=BOTH;
-- Or use default portALTER SYSTEM SET local_listener = '' SCOPE=BOTH;
-- For non-standard portALTER SYSTEM SET local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1522))' SCOPE=BOTH;
-- Register after changesALTER SYSTEM REGISTER;
Solution 2: Fix Connection Descriptors
Section titled “Solution 2: Fix Connection Descriptors”Update tnsnames.ora
Section titled “Update tnsnames.ora”# Check current entrycat $TNS_ADMIN/tnsnames.ora
# WRONG - Using SID when SERVICE_NAME expectedORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521)) (CONNECT_DATA = (SID = orcl) # Problem: Using SID ) )
# CORRECT - Using SERVICE_NAMEORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = orcl.domain.com) # Solution: Use SERVICE_NAME ) )
# Alternative with SERVER=DEDICATEDORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl.domain.com) ) )
Use Easy Connect
Section titled “Use Easy Connect”# Easy connect syntax avoids tnsnames.ora issuessqlplus user/pass@server:1521/service_name
# Enable easy connect in sqlnet.oraecho "NAMES.DIRECTORY_PATH= (EZCONNECT, TNSNAMES)" >> $TNS_ADMIN/sqlnet.ora
Solution 3: Fix Listener Configuration
Section titled “Solution 3: Fix Listener Configuration”Static Service Registration
Section titled “Static Service Registration”# 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 registrationSID_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 listenerlsnrctl stoplsnrctl start
Multiple Listener Configuration
Section titled “Multiple Listener Configuration”# If multiple listeners, ensure correct one is used# Check all running listenerslsnrctl status LISTENERlsnrctl status LISTENER1521lsnrctl status LISTENER1522
# Verify database is registering with correct listenersqlplus / as sysdbaSHOW PARAMETER local_listener;
# Set to specific listenerALTER SYSTEM SET local_listener = 'LISTENER1522' SCOPE=BOTH;ALTER SYSTEM REGISTER;
Solution 4: Service Management
Section titled “Solution 4: Service Management”Create Custom Service
Section titled “Create Custom Service”-- Create application-specific serviceBEGIN DBMS_SERVICE.CREATE_SERVICE( service_name => 'MYAPP_SERVICE', network_name => 'myapp.domain.com' );END;/
-- Start the serviceBEGIN DBMS_SERVICE.START_SERVICE(service_name => 'MYAPP_SERVICE');END;/
-- Check service statusSELECT name, network_name, creation_dateFROM dba_servicesWHERE name = 'MYAPP_SERVICE';
-- Register with listenerALTER SYSTEM REGISTER;
Service Monitoring
Section titled “Service Monitoring”-- Monitor service availabilitySELECT inst_id, name, network_name, creation_date, GOAL, CLB_GOALFROM gv$servicesWHERE name NOT LIKE 'SYS%'ORDER BY inst_id, name;
-- Check service metricsSELECT service_name, stat_name, valueFROM v$service_statsWHERE service_name = 'MYAPP_SERVICE';
Advanced Troubleshooting
Section titled “Advanced Troubleshooting”Debug Registration Issues
Section titled “Debug Registration Issues”-- Check registration queueSELECT * FROM v$listener_network;
-- Force immediate registrationALTER SYSTEM REGISTER;
-- Check registration delay-- Registration happens every 60 seconds by defaultSHOW 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 errorsSELECT originating_timestamp, message_textFROM x$dbgalertextWHERE message_text LIKE '%TNS%' OR message_text LIKE '%listener%'ORDER BY originating_timestamp DESC;
Network Troubleshooting
Section titled “Network Troubleshooting”# Test network connectivitytelnet server 1521nc -zv server 1521
# Check if listener is on expected interfacenetstat -an | grep 1521lsof -i :1521
# DNS resolutionnslookup serverping server
# Check firewalliptables -L -n | grep 1521
Service Discovery
Section titled “Service Discovery”-- Find all available services in databaseSELECT 'SERVICE_NAME: ' || name as available_servicesFROM v$servicesUNION ALLSELECT 'SID: ' || instance_nameFROM v$instance;
-- Show service historySELECT service_name, creation_date, network_nameFROM dba_servicesORDER BY creation_date;
-- Check for duplicate servicesSELECT name, COUNT(*)FROM v$servicesGROUP BY nameHAVING COUNT(*) > 1;
Prevention Strategies
Section titled “Prevention Strategies”Automated Service Monitoring
Section titled “Automated Service Monitoring”-- Create service monitoring tableCREATE TABLE service_availability_log ( check_time TIMESTAMP DEFAULT SYSTIMESTAMP, service_name VARCHAR2(64), status VARCHAR2(20), error_message VARCHAR2(500));
-- Monitoring procedureCREATE 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 monitoringBEGIN 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 Checks
Section titled “Listener Health Checks”#!/bin/bashLOG_FILE="/var/log/oracle/listener_health.log"
echo "$(date): Checking listener health" >> $LOG_FILE
# Check listener statusif 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 fielse echo "$(date): CRITICAL: Listener is not running!" >> $LOG_FILE # Could trigger restart herefi
RAC-Specific Issues
Section titled “RAC-Specific Issues”RAC Service Registration
Section titled “RAC Service Registration”-- Check all instances in RACSELECT inst_id, instance_name, status FROM gv$instance;
-- Check service distribution across nodesSELECT inst_id, name, network_nameFROM gv$servicesWHERE name = 'RACDB'ORDER BY inst_id;
-- Add service to specific instancesBEGIN 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 registrationSHOW PARAMETER remote_listener;-- Should be set to SCAN:PORT
Related Errors
Section titled “Related Errors”- ORA-12154 - TNS:could not resolve connect identifier
- ORA-12541 - TNS:no listener
- ORA-12519 - TNS:no appropriate service handler
- ORA-12170 - TNS:connect timeout occurred
Quick Reference
Section titled “Quick Reference”Service Registration Checklist
Section titled “Service Registration Checklist”- ✓ Database instance is started and OPEN
- ✓ SERVICE_NAMES parameter is set correctly
- ✓ LOCAL_LISTENER parameter matches listener
- ✓ Listener is running on expected port
- ✓ Run ALTER SYSTEM REGISTER
- ✓ Verify with lsnrctl services
- ✓ Test connection with correct service name
- ✓ Check for firewall/network issues
Emergency Quick Fixes
Section titled “Emergency Quick Fixes”# 1. Check listener statuslsnrctl status
# 2. If listener down, start itlsnrctl start
# 3. Connect to database and registersqlplus / as sysdbaALTER SYSTEM REGISTER;
# 4. Verify registrationlsnrctl services
# 5. Test connectiontnsping service_name
# 6. Use alternative connection if neededsqlplus user/pass@server:1521/service_name
Common Connection Strings
Section titled “Common Connection Strings”# Standard service connectionsqlplus user/pass@service_name
# Direct service connectionsqlplus 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)))"