Introduction
Actually I wanted to start this one with … and a funny thing happened on the way to the circus , but lets save that one for another occasion okay ? Last week I got a mail from one of the users who tried to connect via ezconnect to an existing database from new client that i had set up for him. AS always a challenge to see what is going on and of course it takes time to find out the real deal.
Details:
## This case occurred in a 11.2 environment on one of the test boxes . They were trying to connect via ezconnect to one of the existing databases which failed:
[10:30:23] [ INFO] SQL Runner: Starting runing script on database SCOTT/SCOTT@MYSRVR1:1521/MYDB1
[10:30:26] [ INFO] INPUT> ERROR:
[10:30:26] [ INFO] INPUT> ORA-12154: TNS:could not resolve the connect identifier specified
[10:30:26] [ INFO] INPUT>
[10:30:26] [ INFO] INPUT>
[10:30:26] [ INFO] INPUT> SP2-0306: Invalid option.
[10:30:26] [ INFO] INPUT> Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]]
[10:30:26] [ INFO] INPUT> where ::= [/][@<connect_identifier>]
[10:30:26] [ INFO] INPUT> ::= [][/][@<connect_identifier>]
[10:30:26] [ INFO] INPUT> ERROR:
[10:30:26] [ INFO] INPUT> ORA-12162: TNS:net service name is incorrectly specified
[10:30:26] [ INFO] INPUT>
[10:30:26] [ INFO] INPUT>
##However a Tnsping was working correctly
tnsping MYDB1
TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 10-FEB-2014 10:31:14
Copyright (c) 1997, 2011, Oracle. All rights reserved.
Used parameter files:
/opt/SP/STORAGE/TNS_ADMIN/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ENABLE=BROKEN)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MYSRVR1.vfnl.dc-ratingen.de)(PORT = 1521)))(CONNECT_DATA=(SERVICE_NAME=MYDB1.test.nl)))
OK (130 msec)
## Since this was a 11.2 test environment I was able to play a bit with the environment. What puzzled me most was that a different database showed both the short service name and the fully qualified name of the service ( with the domain name in it ) in the listener. And when added the short service name MYDB1 next to the qualified service name MYDB1.test.nl listener would still not pick up both services , even when I read that pmon was supposed to register the services automatically in frequent intervals (60 seconds) .
Added some entries to my tnsnames.ora and started testing . And indeed the full service name worked and the short service refused to ! Performed the test that I bounced the database ( again this was test so not that much harm done) with no better effect . Even the restart of listener did not bring the solution.
So it was clear that I needed to see what was different between the two environments since I had one other database automatically registered in the listener with both the services I was looking for.
Bottom-line after investigation is it works now after the restart of the database and setting some parts different. 🙂 Lets check .
Oh and I performed three actions in the database to make it work. And yes the database and not the listener cause the 11.2 environment lets the database register the services automatically with a listener (well as long as one plays by the rules):
##First I added the short service name to the database ( this is not a Rac environment so I did not set up a service in the clusterware using srvctl ( and ok I admit it i tried and clusterware replied that you cannot add a service with the same name as the database).
T his is how my services look now:
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string MYDB1.test.nl, MYDB1
##Made sure that if the local listener is in place it is pointing to the correct listener
## Just wanted to make sure that the correct listener would be used so in this test i added both my listeners:
SQL>show parameter listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks string
local_listener string (DESCRIPTION=(ADDRESS_LIST=(AD
DRESS=(PROTOCOL=TCP)(HOST=195.
233.124.139)(PORT=1522))(ADDRE
SS=(PROTOCOL=TCP)(HOST=195.233
.124.139)(PORT=1521))))
remote_listener string
## And yes the Domain was set:
SQL> show parameter domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string test.nl
## The environment that was working did not have set the db_domain parameter so in this test I removed it too: It is now
SQL> show parameter domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string
Now the listener , it is showing both services :
Service "MYDB1" has 1 instance(s).
Instance "MYDB1", status READY, has 6 handler(s) for this service...
Service "MYDB1.test.nl" has 1 instance(s).
Instance "MYDB1", status READY, has 6 handler(s) for this service...
I tested it myself with two entries in tnsnames ( short name and long one and both work
MYDB1MBK1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = MYSRVR1.vfnl.dc-ratingen.de)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = MYDB1.test.nl)
)
)
MYDB1MBK2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = MYSRVR1.vfnl.dc-ratingen.de)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = MYDB1)
)
This workaround worked so I informed customer to test it. Will have to test on another environment the effect if i keep db_domain ( and of course db_unique_name) and leave the services to blank.
Happy reading ,
Mathijs