今天上班第二天,发现一个很奇怪的问题。主管发给了我一个tnsname.ora文件,
我用pl/sq developer可以登录 。但使用IP不能连接远程数据库,只能使用连接串。
sqlplus user/4567@10.10.143.148:1521/crmbcv4
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 8月 31 16:36:06 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS: 无法解析指定的连接标识符
在群里问了一下,小路讲使用这种格式可用
sqlplus username/password@连接串
试了一下,解决了。
小顽童猜测他们的tnsname.ora设置里面没有我机器的IP地址。所以你用IP地址的方式连不上去。
最后查了一些资料,把笔记里的资料重新整理了一下。如下:
sqlnet.ora,tnsnames.ora,另外还有listener.ora,都是放在$ORALCE_HOME\network\admin目录下。
sqlnet.ora用在oracle client端,用于配置连接服务端oracle的相关参数.
tnsnames.ora用在oracle client端,用户配置连接数据库的别名参数
listener.ora用在oracle server端,配置oracle服务端程序的监听参数
sqlnet.ora类似于操作系统的/etc/netsvc.conf文件,里面对解析的优先顺序进行编排
tnsname.ora类似于操作系统的/etc/hosts文件,本地将TNS名解析为目标IP地址及Service-Name
listener.ora类似于操作系统的/etc/services文件,里面定义了监听的端口、服务名等
1.1.1.sqlnet.ora(客户端)
通过这个文件来决定怎样找一个连接中出现的连接字符串。例如我们客户端键入
sqlplus test/test@orcl,如果sqlnet.ora是下面这样:
NAMES.DEFAULT_DOMAIN = localdomain
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
&说明
NAMES.DEFAULT_DOMAIN指定网络域名。
NAMES.DIRECTORY_PATH指定当解析客户端连接标识符时命名方法(naming metthods)采用的优先顺序从左至右递减在CAMS应用中。
这两个参数采用上述所示的系统缺省值。
示例文件:
# sqlnet.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME, ONAMES)
SQLNET.AUTHENTICATION_SERVICES= (NTS)
这个表示采用OS认证,在数据库服务器上,可以利用sqlplus / as sysdba。
一般这个配置在windows上是ok的,在unix环境下可能会有问题,一般在unix下可以去掉这个配置。
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)
表示将首先利用tnsnames进行解析;如果tnsnames解析不到,将使用hostname通过网络的途径解析IP;��果hostname解析不到,将采用onames进行解析;例如我们客户端输入:sqlplus test1/test1@test,那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.
如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的IP地址然后去连接这个IP上global_name=test这个实例,当然我这里orcl并不是一个主机名。
在10g下NAMES.DIRECTORY_PATH增加了EZCONNECT。使用EZCONNECT必须满足以下要求:
1.oracle net servieces 10g必须安装在客户端
2.客户端以及服务器必须支持TCP/IP,并启用
3.不允许高级连接描述特性,如:连接池
方法示例:connect scott/tiger@hostname:port/servicename
ORA-12514一个很常见的原因是NAMES.DIRECTORY_PATH漏了TNSNAMES,可能是Oracle Net Configuration时少选了Oracle Names选项。
1.1.2.Tnsnames.ora客户端
这个文件放在客户端机器上,记录客户端访问数据库的本地配置,其实就是定义网络服务,只有当sqlnet.ora中有"NAMES.DIRECTORY_PATH= (TNSNAMES)"这样的字样时,也就是客户端解析连接字符串的顺序中有TNSNAMES时,才会尝试使用这个文件。
示例文件:
# TNSNAMES.ORA Network Configuration File: D:\oracle\fullOracle\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
test_link = //网路服务名
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 108.108.108.108)(PORT = 1521))
//访问数据库使用的协议,数据库计算机的主机名或IP地址,数据库的端口号
)
(CONNECT_DATA =
(SID = test) //数据库实例名
(SERVER = DEDICATED)
(SERVICE_NAME = test)
)
)
protocol一般为TCP,HOST可以为IP,可以是可Ping的通的主机名,Service_Name = orcl是服务器的SID,Server = ?可分为共享服务器和专用服务器两种体系结构。共享服务器依靠调度程序服务处理来自客户端的连接请求,单个调度程序可以同时为多个客户机连接提供服务。而专用服务器进程不要求客户端共享任何资源,一个session启动一个process。
1.1.3.listener.ora(服务器端)
它是listener监听器进程的配置文件。关��listener进程就不多说了,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。
Listener.ora文件的例子
#listener.ora Network Configuration File: #E:\oracle\product\10.1.0\Db_2\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
#下面定义LISTENER进程为哪个实例提供服务
#这里是ORCL,并且它对应的ORACLE_HOME和GLOBAL_DBNAME
#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做数据库连接
SID_LIST_LISTENER =
(SID_LIST = //这里定义LISTENER进程为哪个实例提供服务
(SID_DESC =
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = E:\oracle\product\10.1.0\Db_2)
(SID_NAME = ORCL)
)
)
#监听器的名字,一台数据库可以有不止一个监听器
#再向下面是监听器监听的协议,ip,端口等,这里使用的tcp1521端口,并且使#用的是主机名
LISTENER =
(DESCRIPTION =
ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521)) //监听器监听的协议,IP,端口等
)
上面的例子是一个最简单的例子,但也是最普遍的。一个listener进程为一个instance(SID)提供服务。