tnsnames.ora is used by the client to communicate with the listener listener.ora is used by the listener to communicate with the database
Original at edstevensdba.wordpress.com
grep -E -v '^ ' tnsnames.ora|grep -v '^$'|grep -v LISTENER|grep -v '^#'|sed -e 's/=.*$//'|sort -u|wc
Turn on tracing
There are some settings that can help…
Setting a value greater than 0 ensures that connections are not left open indefinitely, due to, for example, an abnormal client termination.
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME) ADR_BASE = /oracle/product DIAG_ADR_ENABLED=OFF sqlnet.expire_time=10 DEFAULT_SDU_SIZE=11280
The contents of this file can get pretty nasty and outdated. Keeping it clean and up-to-date is a very good idea but what should be in there?
95% of the file can be cleaned up with this. It addresses the first point above by spitting out only the stanzas in use by instances on this host.
#!/usr/bin/env perl # ============================================================================== # Name : clean_tnsnames.ora.pl # Description : extracts the relevant stanzas from tnsnames.ora # # Parameters : 1 - hostname # # Notes : Must be run from the $TNS_ADMIN directory # hostname should be supplied in case clustername is different # # Example : ./tns.pl hn481 # # Modification History # ==================== # When Who What # ========= ================= ================================================== # 24-MAY-20 Stuart Barkley Created # ============================================================================== use strict; use warnings; die "ERROR: Usage: tns.pl <host>\n\n" unless @ARGV == 1; my ($host) = @ARGV; # -------------------------------------------------- # build an array of instances running on this server # -------------------------------------------------- my @running_sids = qx[ps -eo args|grep pmon|sed -e 's/ora_pmon_//'|grep -vE "grep|sed"]; chomp @running_sids; #print "running_sid array:\n", join "\n",@running_sids, "\n"; # ---------------------------------------------------------- # build an array of tnsnames stanzas that match current host # ---------------------------------------------------------- local $/ = ''; my @stanzas; open (DATA, "<tnsnames.ora") or die "Could not open tnsnames.ora file, $!"; while (<DATA>) { chomp; if (m/$host/i) {push @stanzas, $_}; } close (DATA); #print "stanza array:\n", join "\n\n", @stanzas, "\n"; $/ = "\n"; # --------------------------------------------------------- # print only the tns stanzas matching the running instances # --------------------------------------------------------- my (@matches, @sorted, @unique); foreach my $running_sid (@running_sids) { push @matches, grep { /$running_sid\b/i } @stanzas; @sorted = sort @matches; @unique = do { my %seen; grep { !$seen{$_}++ } @sorted }; } print join ("\n\n", @unique),"\n\n"; # next bit needs more thinking about # ---------------------------------------------------- #print "add these stanzas needed for database links\n"; # ---------------------------------------------------- #my @db_link_hosts = qx[printf "%s\n%s" "set head off" "select distinct upper(host) from dba_db_links;"|sqlplus -s / as sysdba|grep -v 'selected'|grep -v '^$']; #chomp @db_link_hosts; #foreach my $db_link_host (@db_link_hosts) { # open CMD,'-|','tnsping '||$db_link_host or die $@; # while (defined(my $line=<CMD>)) { # print "$line\n"); # } # close CMD; # print ("tnsping ",$db_link_host,"\n"); #}
The clause for LISTENER_FEUK11UD is a reference for the local_listener parameter.
LISTENER_FEUK11UD =
(ADDRESS = (PROTOCOL = TCP)(HOST = hn481)(PORT = 1521))
FEUK11UD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hn481)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = FEUK11UD)
)
)
Setting the local_listener in the database to the connection string instead of the connect identifier can help the debugging process…
alter system set local_listener="(ADDRESS = (PROTOCOL = TCP)(HOST = hn481)(PORT = 1521))" scope=both;
Setting STARTUP_WAIT_TIME_LISTENER Setting CONNECT_TIMEOUT_LISTENER
STARTUP_WAIT_TIME_LISTENER_FEUK11UD = 0
CONNECT_TIMEOUT_LISTENER_FEUK11UD = 30
LISTENER_FEUK11UD =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = HFE2PrePrdOra)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER_FEUK11UD = /oracle/product
Check what the global_name parameter is in the database
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Mar 21 14:00:48 2019 Version 18.4.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.4.0.0.0 SQL> select * from global_name; GLOBAL_NAME ------------------------- UPG.WORLD
listener.ora specifying global_dbname without the domain
LSNR481_184 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hn481)(PORT = 3531))
)
)
SID_LIST_LSNR481_184 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = upg)
(SID_NAME = upg)
(ORACLE_HOME = /cln/tst/ora_bin1/app/oracle/product/18.4/dbhome_1)
)
)
What services are recognised?
$ORACLE_HOME/bin/lsnrctl services lsnr481_184
LSNRCTL for IBM/AIX RISC System/6000: Version 18.0.0.0.0 - Production on 21-MAR-2019 21:28:24
Copyright (c) 1991, 2018, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hn481.cln.be)(PORT=3531)))
Services Summary...
Service "upg" has 1 instance(s).
Instance "upg", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:5 refused:0
LOCAL SERVER
The command completed successfully
listener.ora specifying global_dbname with domain
LSNR481_184 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hn481.cln.be)(PORT = 3531))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC3531))
)
)
SID_LIST_LSNR481_184 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = upg.world)
(SID_NAME = upg)
(ORACLE_HOME = /cln/tst/ora_bin1/app/oracle/product/18.4/dbhome_1)
)
)
What services are recognised now?
$ORACLE_HOME/bin/lsnrctl services lsnr481_184
LSNRCTL for IBM/AIX RISC System/6000: Version 18.0.0.0.0 - Production on 21-MAR-2019 21:28:24
Copyright (c) 1991, 2018, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hn481.cln.be)(PORT=3531)))
Services Summary...
Service "upg.world" has 1 instance(s).
Instance "upg", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:5 refused:0
LOCAL SERVER
The command completed successfully