Table of Contents

tnsnames.ora is used by the client to communicate with the listener
listener.ora is used by the listener to communicate with the database

Some basic reminders

Original at edstevensdba.wordpress.com

Count the number of entries in the tnsnames.ora file

grep -E -v '^ ' tnsnames.ora|grep -v '^$'|grep -v LISTENER|grep -v '^#'|sed -e 's/=.*$//'|sort -u|wc

How to parse the listener.log file

Norman's general IT blog - useful Oracle stuff also

Connections fail 10% of the time. How to fix?

Turn on tracing
There are some settings that can help…

sqlnet.ora

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

Clean up the tnsnames.ora

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?

  1. a reference to the service names used by any applications connecting to the databases (generally the database names)
  2. a reference to any useful external services (database link hosts, synonym links, …)

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");
#}

Check to see how many connections there are in the tnsnames.ora file

perl -ne 'print "$1\n" if m/^(\w+)?[=| ]/' tnsnames.ora|grep -vE "^$"|sort|wc -l

Layout of a typical tnsnames.ora stanza

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;

listener.ora

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

Static registration

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