從網路共享上的應用程序連接失敗
編輯: 我測試了更多……如果我將 nslookup 從 Windows 目錄複製到我的映射網路驅動器,它不能’解析主機名:
H:\nslookup dbserver (null) UnKnown Address: 192.168.0.195
如果我使用 C:: 中的預設 nslookup
C:\>nslookup dbserver Server: dnsserver.dom.local Address: 192.168.0.195 Name: dbserver.dom.local Address: 192.168.0.231
所以它與oracle沒有任何關係,我將更改標題和標籤。
我的同事創建的應用程序使用已安裝的 Oracle 客戶端連接到遠端 Oracle 數據庫。從 DFS 上的映射驅動器(在兩台伺服器上)執行這些應用程序會導致連接成功。從另一台伺服器(獨立文件伺服器)上的映射驅動器執行它們會導致沒有任何連接。我通過 Wireshark 對其進行了跟踪,並觀察到甚至沒有嘗試建立連接(根本沒有 oracle 數據包正在退出客戶端)。
我在數據庫伺服器、filserver 和客戶端上禁用了防火牆,但無濟於事。所有映射的網路驅動器(DFS 和標准文件伺服器)都已放入 Intranet 區域。
如果我
tnsping
從本地 Oracle 客戶端安裝中使用,我可以解析主機:OK (20 ms)
如果我使用
tnsping
放置在文件伺服器上的映射網路驅動器中,我不能:TNS-12545: Connect failed because target host or object does not exist
到相同的 Oracle-DB。
我在這裡不知所措,請參閱下面的失敗嘗試日誌摘錄:
nfun2awanm: Getting the path of sqlnet.ora nnfun2awanm: Getting the adapter name nnfun2awanm: exit nsmal: 216 bytes at 0x75e228 nscall: connecting... snlinGetAddrInfo: entry snlinGetAddrInfo: getaddrinfo() failed with error 11003 snlinGetAddrInfo: exit nlad_expand_hst: GetAddrInfo call failed nladini: entry nladini: exit nladget: entry nladget: exit nsmal: 89 bytes at 0x7b2c48 nsc2addr: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))(CONNECT_DATA=(SID=instance))) nttbnd2addr: entry snlinGetAddrInfo: entry snlinGetAddrInfo: getaddrinfo() failed with error 11001 snlinGetAddrInfo: exit nttbnd2addr: looking up IP addr for host: dbserver snlinGetAddrInfo: entry snlinGetAddrInfo: getaddrinfo() failed with error 11003 snlinGetAddrInfo: exit nttbnd2addr: *** hostname lookup failure! *** nttbnd2addr: exit nserror: nsres: id=0, op=77, ns=12545, ns2=12560; nt[0]=515, nt[1]=1003, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0 nsmfr: 89 bytes at 0x7b2c48 nscall: connecting... nladget: entry nladget: exit
與成功的 tnsping 相比:
nnfun2awanm: Getting the path of sqlnet.ora nnfun2awanm: Getting the adapter name nnfun2awanm: exit nsmal: 216 bytes at 0x31426e8 nscall: connecting... snlinGetAddrInfo: entry snlinGetAddrInfo: exit snlinGetNameInfo: entry snlinGetNameInfo: exit snlinFreeAddrInfo: entry snlinFreeAddrInfo: exit nladini: entry nladini: exit nladget: entry nladget: exit nsmal: 95 bytes at 0x30f3158 nsc2addr: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.231)(PORT=1521))(CONNECT_DATA=(SID=instance))) nttbnd2addr: entry snlinGetAddrInfo: entry snlinGetAddrInfo: exit nttbnd2addr: using host IP address: 192.168.0.231 snlinFreeAddrInfo: entry snlinFreeAddrInfo: exit nttbnd2addr: exit nsmal: 996 bytes at 0x3142bc8 nsmal: 2120 bytes at 0x3142fb8 nsmal: 84 bytes at 0x3143948 nsopen: opening transport... nttcon: entry nttcon: toc = 1 nttcnp: entry nttcnp: exit nttcni: entry nttcni: Tcp conn timeout = 60000 (ms) nttctl: entry nttctl: Setting connection into non-blocking mode nttcni: trying to connect to socket 564. ntt2err: entry ntt2err: exit ntctst: size of NTTEST list is 1 - not calling poll nttctl: entry nttctl: Clearing non-blocking mode snlinGetNameInfo: entry snlinGetNameInfo: exit nttcni: connected on ipaddr 192.168.0.99 nttcni: exit nttcon: set TCP_NODELAY on 564 nttcon: exit nsopen: transport is open
通過將這些結果粘貼到 serverfault 中,我才意識到成功的嘗試可以通過 DNS 解析主機名,而失敗的則不能。所以它似乎甚至與 Oracle 無關?
如您所想,這是獨立伺服器上的主機名解析問題。
使用名稱的獨立伺服器上的 TNS 別名
dbserver
似乎與使用 tnsping 工作的伺服器上192.168.0.231
使用 IP 的別名不同。您可以修改
tnsnames.ora
獨立伺服器上的文件以使用 IP192.168.0.231
或在文件中添加條目以hosts
解析名稱 dbserver