why tns-12545?
ORC1 =tns如下配置:
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 133.200.9.*)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orc)
(INSTANCE_NAME = orc1)
)
)
sqlplus system/root@orc1连接正常。
而注释掉 (INSTANCE_NAME = orc1)后,会报tns-12545。提示无法找到主机。
因为host指定的是ip地址,所以一开始比较糊涂。后来发现,在c:\winnt\system32\drv\etc\hosts里面加上 133.200.9.* jfa01,其中jfa01是服务器的主机名,就不会出现12545错误了。
看来问题还是出现在解析hostname上了。
问题是tnsnames里面用的是ip地址,那么为什么还要hostname呢?
在metlink上找到了这篇文档:
Note:131658.1 How MTS and DNS are related, MTS_DISPATCHER and ORA-12545
其中有:
When the client sends a connection request to a MTS-configured database server,
the following steps occur:
1.- The client sends a packet to the listener, using the address specified in
the client TNSNAMES.ORA file
2.- The listener receives this packet, then sends back a packet to the client
machine containing information about the dispatcher address. This is because the listener redirects this client to a dispatcher process.
The information sent inside this packet is the same as that seen in the listener services summary. In this example, the listener will send a packet with:
(ADDRESS=(PROTOCOL=tcp)(HOST=rtcsol1.us.oracle.com)(PORT=59034))
^^^^^^^^^^^^^^^^^^^^^
3.- Finally, when the client receives this packet, it sends a conection request to the dispatcher using the address received from the listener.
说明虽然客户端指定了ip地址,但是在和服务器的listener交互的时候,服务器又把hostname发给了客户端了。这才出现tns-12545。
那么为什么在tnsnames.ora里面指定了instance-name就好了呢?
我想这可能是因为oracle在2种情况下,互相握手的步骤不一样吧。
至于握手过程到底怎么样,还需要研究一下。
继续看文档,发现如下论述:
把默认的mts_dispatchers = "(protocol=TCP)"改成mts_dispatchers = "(ADDRESS=(protocol=TCP)(HOST=<ip address>))。
这样在握手过程中,listener就不会向客户端发送主机名,而是发送ip了。这样也可以避免tns-12545。
试着修改了几次,总是不能正确修改这个参数。
于是把listener里面的hostname改成ip,就可以了。
***********************************************
2008年2月新增:
10G默认配置里,如果做service的双机负载均衡,在一个连接被重新定向到另外一个intance的时候,也会报这个错误
解决方法是设置instance的local_listener参数即可。