再次学习oracle的listener,ora配置文件详解
分类:美高梅-数据

TNS是Oracle Net的一部分,是专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,就必须配置TNS。本文主要讲述了Oracle数据库TNS常见错误的解决方法如下:

今天客户遇到问题,报ora-12154错误,以前一直好用怎么能突然不正常呢?由于是电话指导对方,不能细测,最好将本地服务链接删除后重建,问题解决了。以下网上查找的总结,感觉不错,转过来瞧瞧

原文地址(http://server.zol.com.cn/127/1273876.html),

之前因为安装的是windows server 2008 r2的系统,oracle是11g r2 64bit,因为像很多网友一样,无法使用pl/sql developer 8连接oracle,今天可算连上了,对listener.ora sqlnet.ora tnsnames.ora三个文件、TNSListener服务的认识也深了一层。

Oracle网络配置 
三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目录下。

1、ORA-12541:TNS:没有监听器

 

先说说我是怎么样连接上的:

英文说明:

原因:没有启动监听器或者监听器损坏。若是前者,使用命令net start OracleOraHome10gTNSListener即可;如果是后者,则使用“Net Configuration Assistant”工具向导之“监听程序配置”增加一个监听器即可(基本不用写任何信息,一路OK。在添加之前可能需要把所有的监听器先删!)

前几天,同事装上oracle的客户端,在ASP.Net下面怎么连都连不到oracle数据库(操作系统是XP,报错找不到OIC.DLL,之前我也遇到过,重装了一下客户端就好了,我用的是2000 professional的系统)。后来我到Oracle官方网站上寻找解决方案,下载了Oracle Developer Tools for Visual Studio .NET 10.1.0.4.0 (ODT for VS.Net),把它装上之后,可以在.net中浏览oracle数据库,估计可以浏览oracle数据库了,应该可以操作oracle数据库,鼓吹通事把ODT for VS.Net装上之后,果然他的机器上的ASP.Net程序可以正常连接oracle了,就是这个问题,昨天装了整整一天的系统。

我先安装了Oracle9i客户端精简版,然后将原来oracle 11g r2的network文件夹下的tnsnames.ora文件覆盖掉精简客户端下的network文件夹中的tnsnames.ora。

The sqlnet.ora is an optional file expressing more parameters about the connection (eg: the trace level for debugging, the types of authentication you would like to support and so on). It may be found on the client or the server.

2、ORA-12500:TNS:监听程序无法启动专用服务器进程或ORA-12560:TNS:协议适配器错误

    今天上午他的问题刚刚解决,下午我这边就出了问题,连接oracle时报错,信息如下"ORA-12154: TNS: 无法解析指定的连接标识符", 到google上到处搜,看到一些英文的网站的答案是修改tnsname.ora就可以修复连接。检查了一下也没发现这个文件的问题。

下面启动pl/sql developer,在支持信息中便会看到我tnsnames.ora下所编写的相关信息:

The tnsnames.ora is used to find a Net8 listener and connect to it and pass to it the details of the database instance youwould like to connect to. It will be found on the client side. Note that a SERVER can be a client of another database so it is typical to find it on the SERVER as well.

原因:ORACLE的数据库服务没有启动。使用命令net start ORACLESERVICEORADB即可。如果仍没有解决,请继续向下看。

    估计是安装ODT for VS.Net之后,OracleHome和OracleSID有重复或者无效, 到注册表中一看,果然是有问题,发现HKey_LocalMachineSoftwareOracle下面的Oracle_Home路径被改成了E:program files, 我的oracle是装在E:oracle目录的,于是把这个改了,再试,系统也重起了,依然无效,后来想干脆把ODT 给删了,于是到控制面板找Oracle Developer Tools, 怎么都找不到,到是找到了ODP for .Net,把这个给卸载了,以前装的Oracle Developer Tools目录(E:Oracleproduct10.1.0Client_1)依然没有被删除,于是手动删除这个目录,提示OCI.dll正在使用,无法删除,再尝试把这个目录给重命名了,居然命名成功。于是重启系统,再运行Asp.Net的客户端,成功连接Oracle数据库。

图片 1

The listener.ora is used to setup the configuration of the net8 listener. to specify the port it will listen on, give it the details of the databases it can connect to and so on. This file is on the SERVER only.

3、如果数据库服务启动失败,则很有可能是其注册表项值损坏,最好的做法是以下两步:

    总结一下,装了解决Oracle Developer Tools之后,出现“ORA-12154: TNS: 无法解析指定的连接标识符”报错的解决方法如下:

那么登录时,在pl/sql developer登录框中便会看到tnsnames.ora中定义的tnsname:

1.  sqlnet.ora-----通过这个文件来决定怎么样找一个连接中出现的连接字符串。 
例如我们客户端输入 
sqlplus sys/oracle@ora 
假如我的sqlnet.ora是下面这个样子 
SQLNET.AUTHENTICATION_SERVICES= (NTS) 
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME,EZCONNECT) 
那么,客户端就会首先在tnsnames.ora文件中找ora的记录.如果没有相应的记录则尝试把ora当作一个主机名,通过网络的途径去解析它的 ip地址然后去连接这个ip上GLOBAL_DBNAME=ora这个实例,当然我这里ora并不是一个主机名

ORADIM -DELETE -SID oradb 删除数据库服务项ORADIM -NEW -SID oradb 新增数据库服务项注意:这个过程中如果出错,就重启计算机!

    1.检查注册表,HKey_LocalMachineSoftwareOracle下面的Oracle_Home,若不对,修改成正确的;

图片 2

EZCONNECT表示:可以使用简单的方式连接Oracle例如:

4、ORA-12154:TNS:能解析服务名

    2.卸载ODP for .Net (或者卸载ODT for .Net, ODT中包含ODP, ODT 是VS.Net的一个集成插件,用于连接和浏览oracle数据库,并且提供对oracle数据库的拖拽操作,类似VS.Net对于SQL Server的资源管理器);

同时,决定是否登录成功的因素还有listener进程处于可用状态,你可以尝试一下,停止listerner服务(停止了listener进程,与listener.ora联系):

 

原因:ORACLE的网络服务名没有正确配置。请使用“Net8 Configuration Assistant”工具向导之“本地网络服务名配置”配置TNS即可。如果仍没有解决,请继续向下看。

    3.如果ODT for .Net的目录依然存在,删除或者重命名此目录;

图片 3

1 CONNECT username/password@host[:port][/service_name][/instance_name]  
2 CONNECT username/password@host[:port][/service_name]  
3 sqlplus / as sysdba  
4 sqlplus sys as sysdba/sys@127.0.0.1:1521 

5、ORA-1034 :TNS:ORACLE不可用

    然后重起系统,重新连接ASP.Net程序,如果还有同样的错误,看着办吧,我建议重装Oracle吧。

那么就会提示错误:

 

原因:ORACLE的数据库服务正确启动,但是数据库没有打开!使用命令:connect internal 以internal身份登陆startup 打开数据库

    分析原因:系统原来装的是ORACLE 10G 10.1.0,卸载后还没重启就装上10.2.0,结果先是监听器起不来,竟然还是指向10.1.0的位置,监听器当然不能启动了。

图片 4

如果我是这个样子 

6、ORA-12560:TNS:协议适配器错误

    处理过程:
    1、查找注册表,将监听器指向新的位置,重启服务,OK;
    2、PL/SQL DEVELOPER还是连接不了,其它方式都正常。将原先安装在其它逻辑盘的ODP for .Net 卸载重装到与ORACLE 10.2.0同一位置。重启系统,DEVELOPER还是报错,不过些时报错提示信息为空。
    3、因为DEVELOPER设置有更改后,进入菜单TOOLS》PREFERENCES...设置,在ORACLE下的CONNECTION中,将ORACLE HOME和OCI LIBIARY设为空即自动检测。连接正常,问题解决。

最后,恭喜你使用pl/sql developer 8登录oracle 11g r2 64bit成功啦。

NAMES.DIRECTORY_PATH= (TNSNAMES) 
那么客户端就只会从tnsnames.ora查找ora的记录,括号中还有其他选项,如LDAP等并不常用。

原因:未知。解决:必杀技--打开“Windows任务管理器”,杀死ORACLE.exe及ORADIM.exe进程,书写自己的ora_startup.bat,执行之!PS:

    二、应用程序中报错:

为了更好理解其背后的原理,我转载一篇很好的文章:

2.  tnsnames.ora------这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应。 
只有当sqlnet.ora中类似NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。 
例子: 
ORA_TEST = 
    (DESCRIPTION = 
       (ADDRESS_LIST = 
          (ADDRESS = (PROTOCOL = TCP)(HOST = LXL)(PORT = 1521)) 
       ) 
      (CONNECT_DATA = 
         (SERVER = DEDICATED) 
         (SERVICE_NAME = ora) 
      ) 
    ) 

ora_startup.bat:

    一个很难想到的引起ORA-12154的原因
        使用OracleClient.OracleConnection时(我连的是Oracle 9i,其他版本未知),如果你的执行目录太长或者有括号等(未考察有些什么符号),那么即使你的服务名是对的,也会引起ORA-12154问题“TNS: 无法处理服务名”,当出现这个问题时,请也考虑这个原因。

oracle listener.ora sqlnet.ora tnsnames.ora 三个文件的关联性

ORA_TEST:客户端连接服务器端使用的服务别名。注意一定要顶行书写,否则会无法识别服务别名。 
PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。 
HOST:ORACLE服务器端IP地址或者hostname。确保服务器端的监听启动正常。 
PORT:数据库侦听正在侦听的端口,可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。 
SERVICE_NAME:在服务器端,用system用户登陆后,sqlplus> show parameter service_name命令查看。

net start OracleOraHome81TNSListenernet start ORACLESERVICEORADB

 

首先来说Oracle的网络结构,三个配置文件listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOMEnetworkadmin目录下。
重点:三个文件的作用和使用
1 sqlnet.ora
作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串(service_name),
例如我们客户端输入
sqlplussys/oracle@demo
假如我的sqlnet.ora是下面这个样子

3.  listener.ora------listener监听器进程的配置文件  关于listener进程就不多说了,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。 
例子: 
#listener.ora Network Configuration File: #E:/oracle/product/10.1.0/Db_2/NETWORK/ADMIN/listener.ora 
# Generated by Oracle configuration tools. 
SID_LIST_LISTENER = 
    (SID_LIST = 
         (SID_DESC = 
             (GLOBAL_DBNAME = ora) 
             (ORACLE_HOME = E:/oracle/product/10.1.0/Db_2) 
             (SID_NAME = ora) 
         ) 
    )

svrmgrl 一般情况下不用,不过有时少不了它的,具体步骤见第5步。

 

SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)

LISTENER = 
    (DESCRIPTION = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)) 
    )

ora_shutdown.bat:

 

那么,客户端就会首先在tnsnames.ora文件中找demo的记录.如果没有相应的记录则尝试把demo当作一个主机名,通过网络的途径(hosts文

LISTENER :监听名称,可以配置多个监听,多个监听的端口号要区分开来。 
GLOBAL_DBNAME :全局数据库名。通过select * from global_name; 查询得出 
ORACLE_HOME :oracle软件的跟目录 
SID_NAME :服务器端(本机)的SID 
PROTOCOL:监听协议,一般都使用TCP 
HOST:本机IP地址,双机时候使用浮动IP 
PORT:监听的端口号,使用netstat –an 检查该端口不被占用。

net stop OracleOraHome81TNSListenernet stop ORACLESERVICEORADB

B.进行适当的配置
如何正确配置tnsname.ora文件:
可以在客户端机器上使用oracle Net Configuration Assistant或oracle Net Manager图形配置工具对客户端进行配置,该配置工具实际上修改tnsnames.ora文件。所以我们可以直接修改tnsnames.ora文件,下面以直接修改tnsnames.ora文件为例:
该文件的位置为: …networkadmintnsnames.ora (for windows)
…/network/admin/tnsnames.ora (for unix)
此处,假设服务器名为testserver,服务名为orcl.testserver.com,使用的侦听端口为1521,则tnsnams.ora文件中的一个test网络服务名(数据库别名)为:
test =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
此处的笑脸为)。
  红色的内容为需要根据实际情况修改的内容,现解释如下:
    PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。
    HOST:数据库侦听所在的机器的机器名或IP地址,数据库侦听一般与数据库在同一个机器上,所以当我说数据库侦听所在的机器一般也是指数据库所在的机 器。在UNIX或WINDOWS下,可以通过在数据库侦听所在的机器的命令提示符下使用hostname命令得到机器名,或通过ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址。需要注意的是,不管用机器名或IP地址,在客户端一定要用ping命令ping通数据库侦听所在的机器的机器名,否则需要在 hosts文件中加入数据库侦听所在的机器的机器名的解析。
    PORT:数据库侦听正在侦听的端口,可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。
    SERVICE_NAME:在服务器端,用system用户登陆后,sqlplus> show parameter service_name命令察看。

件)去解析它的ip地址然后去连接这个ip地址上GLOBAL_DBNAME=demo这个实例,当然我这里demo并不是一个主机名
另一种情况:如果是这样

当你输入sqlplus sys/oracle@orcl的时候 
1. 查询sqlnet.ora看看名称的解析方式,发现是TNSNAME 
2. 则查询tnsnames.ora文件,从里边找orcl的记录,并且找到主机名,端口和service_name 
3. 如果listener进程没有问题的话,建立与listener进程的连接。 
4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。 
5. 这时候网络连接已经建立,listener进程的历史使命也就完成了。

ORACLE相关服务名请参见“管理工具”之“服务”中以ORACLE开头的服务名

  如何利用配置的网络服务名连接到数据库:
    用sqlplus程序通过test网络服务名进行测试,如sqlplus system/manager@test。如果不能连接到数据库,则在tnsname.ora文件中的test网络服务名(net service)后面加上sqlnet.ora文件中NAMES.DEFAULT_DOMAIN参数的值,此处我的参数值为testserver.com,将其加到网络服务名后面,修改后的tnsname.ora中关于该网络服务名的内容为:

NAMES.DIRECTORY_PATH= (TNSNAMES)

sql*plus运行基本机理: 
在用户输入sqlplus system/manager@test后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/manager@test.server.com ,然后再到tnsnames.ora文件中找test.server.com网络服务名,这当然找不到了,因为该文件中只有test网络服务名,所以报错。解决的办法就是将sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数注释掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找 test网络服务名,然后取出其中的host ,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。

1、TNS-12154 Error 或ORA-12154特征:SQL*NET没有找到连接串或别名原因1:没有找到TNSNAMES.ORA文件,该文件的缺省路径为:

  什么情况下会引起oracle自动设置NAMES.DEFAULT_DOMAIN参数?
    出现这种情况的典型环境为windows的客户端的‘我得电脑à属性à计算机名à更改à其它…à此计算机的主DNS后缀’中设置了‘primary dns suffix’,因为在这种情况下安装客户端时,会在sqlnet.ora文件中自动设置NAMES.DEFAULT_DOMAIN参数,或许当把计算机加入域中安装oracle客户端时也会出现这种情况,有条件的话大家可以试一下。

那么客户端就只会从tnsnames.ora查找demo的记录,括号中还有其他选项,如LDAP等并不常用。

重点:上面所有的HOST值必须是计算机的主机名,否则只有本机使用127.0.0.1能访问数据库,局域网内的其他主机不能访问【血泪史,不解释】

Windows 95/98 clientSQL*Net 2.x - ORAWIN95NETWORKADMINNet8 - ORAWIN95NET80adminNet8i - ORACLEORA81NETWORKADMINWindows NT clientSQL*Net 2.x - ORANTNETWORKADMINNet8 - ORANTNET80ADMINNet8i - ORACLEORA81NETWORKADMINUNIX Client$ORACLE_HOME/NETWORK/ADMINor /etcor /var/opt/oracle

 

2 Tnsnames.ora
这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似
NAMES.DIRECTORY_PATH= (TNSNAMES)
这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。
下面例子中有两个,demo 对应的本机,SALES对应的另外一个IP地址,里边还定义了使用主用服务器还是共享服务器模式进行连接.
#你所要连接的时候输入得TNSNAME
demo =

并使用telnet 192.168.1.51 1521能连接

. 在客户端设置TNS_ADMIN在注册表 HKEY_LOCAL_MACHINESoftwareOracle 设置TNS_ADMIN. TNS_ADMIN 指向TNSNAMES.ORA文件的位置措施:按上述说明检查文件位置原因2:TNSNAMES.ORA文件中内容格式不对措施:检查文件格式,标准格式如下:

 

(DESCRIPTION =

使用netstat -an可以查看到如下

DEV1.WORLD =(DESCRIPTION = (ADDRESS_LIST =(ADDRESS =   (CONNECT_DATA = 

 

(ADDRESS_LIST =

图片 5

原因3: TNSNAMES.ORA与SQLNET.ORA不一致措施: SQLNET.ORA格式如下:

  我在设置oracle的客户端时一般手工修改tnsnames.ora文件,但是还有许多人喜欢用图形工具配置,该图形工具最终还是修改tnsnames.ora文件,但是它有时会引起其它的问题:
    在用oracle的图形配置软件'net assistant'或‘Net Configuration Assistant’配置网络服务名时,假如已经设置了‘primary dns suffix’,但是在图形配置软件中写的网络服务名的名字中没有‘primary dns suffix’,如只是写了test,则图形配置软件会自动在后面加上‘primary dns suffix’,使之变为test.testserver.com,并存在tnsnames.ora中,而不管你的sqlnet.ora文件中是否有 NAMES.DEFAULT_DOMAIN参数。此时,用图形工具进行测试连接是通过的,但是假如此时sqlnet.ora文件中没有 NAMES.DEFAULT_DOMAIN参数,则你在使用网络服务名时应该使用在tnsnames.ora中的 test.testserver.com,而不是你在图形配置软件中键入的test。解决的办法为:
<1>可以在sqlnet.ora文件中设置NAMES.DEFAULT_DOMAIN= testserver.com,这时你可以用test或test.testserver.com连接数据库
<2>在sqlnet.ora文件中不设置NAMES.DEFAULT_DOMAIN参数,在tnsnames.ora文件中将test.testserver.com中的.testserver.com去掉,这时你可以用test连接数据库。

#下面是这个TNSNAME对应的主机,端口,协议

贴出我的

TRACE_LEVEL_CLIENT = OFFSQLNET.AUTHENTICATION_SERVICES = NAMES.DIRECTORY_PATH = AUTOMATIC_IPC = OFF

    关于为什们在网络服务名后面加db_domain参数,需要了解sql*plus连接数据库的原理,我在后面解决12154常见故障中给出了详细的说明。

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.176 )(PORT = 1521))

sqlnet.ora内容

因为没有NAMES.DEFAULT_DOMAIN=world,所以DEV1.WORLD连接串不能连接,可以在TNSNAMES.ORA中增加

如果上面的招数还不奏效的话,只好用一下乾坤大挪移了。
将客户端的网络服务名部分
test.testserver.com =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
此处的笑脸为)。
拷贝到服务器的tnsnames.ora文件中。然后再服务器端用sqlplus system/manager@test.testserver.com连接到数据库。
    如果能连接成功,说明你的客户端与服务器端的网络有问题。
    如果连接不成功,用前面的部分检查网络服务名部分部分是否正确,如果确信网络服务名部分正确而且所有的客户端都连不上数据库则可能为系统TCP/IP或Oracle系统有问题,建议重新安装数据库。

)
(CONNECT_DATA =

 1 # sqlnet.ora Network Configuration File: E:appAdministratorproduct11.2.0dbhome_1networkadminsqlnet.ora  
 2 # Generated by Oracle configuration tools.  
 3   
 4 # This file is actually generated by netca. But if customers choose to   
 5 # install "Software Only", this file wont exist and without the native   
 6 # authentication, they will not be able to connect to the database on NT.  
 7   
 8 SQLNET.AUTHENTICATION_SERVICES= (NTS)  
 9   
10 NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, EZCONNECT) 
DEV1 =(DESCRIPTION = (ADDRESS_LIST =(ADDRESS =   (CONNECT_DATA = 

常见故障解决办法:
TNS-12154 (ORA-12154):TNS:could not resolve service name
该错误表示用于连接的网络服务名在tnsnames.ora文件中不存在,如上面的tnsnames.ora中的网络服务名只有test,假如用户在连接时用sqlplus system/manager@test1则就会给出TNS-12154错误。
要注意的是,有时即使在tnsnames.ora文件中有相应的网络服务名,可是用该网络服务名连接时还会出错,出现这种情况的典型配置如下(在客户端的机器上):
sqlnet.ora文件:
NAMES.DIRECTORY_PATH = (TNSNAMES, ….)
NAMES.DEFAULT_DOMAIN = server.com
tnsnames.ora文件:
test =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
此处的笑脸为)。

#使用专用服务器模式去连接需要跟服务器的模式匹配,如果没有就根据服务器的模式

 

2、NL-00462 Error 或ORA-00462特征:监听器无法启动原因:LISTENER.ORA文件内容错误,例如,括号不匹配、参数名错误等、多余的空格等。措施:重新编辑文件

 

#自动调节

tnsnames.ora内容

3、NL-00405 Error 或ORA-00405特征:LISTENER.ORA文件不可读或找不到原因:LISTENER.ORA文件内容错误,例如,括号不匹配、参数名错误等、多余的空格等。措施:确保文件位置在缺省目录下$ORACLE_HOME/network/admin,或设置环境变量TNS_ADMIN指向这个文件所在位置。

 

(SERVER = DEDICATED)

 1     # tnsnames.ora Network Configuration File: E:appAdministratorproduct11.2.0dbhome_1NETWORKADMINtnsnames.ora  
 2     # Generated by Oracle configuration tools.  
 3       
 4     LISTENER_ORCL =  
 5       (ADDRESS = (PROTOCOL = TCP)(HOST = LXL)(PORT = 1521))  
 6     ORCL =  
 7       (DESCRIPTION =  
 8         (ADDRESS_LIST =  
 9           (ADDRESS = (PROTOCOL = TCP)(HOST = LXL)(PORT = 1521))  
10         )  
11         (CONNECT_DATA =  
12           (SID = ORCL)  
13         )  
14       )  

4、TNS-01155 Error 或ORA-01155特征:LISTENER.ORA文件中SID_LIST_LISTENER变量赋值不对原因:LISTENER.ORA文件内容错误,SID_LIST_LISTENER变量赋值不对。措施:确保文件中赋值正确,$ORACLE_HOME/network/admin/samples目录下有样例文件,可供参考。

 

#对应service_name,SQLPLUS>show parameter service_name;

 

5、TNS-12537 、TNS-12560、TNS-00507 Error特征:LISTENER.ORA文件中引用了一个无效的协议适配程序原因:LISTENER.ORA文件中PROCOTOL变量赋值不对。措施:确保文件中赋值正确,一般用TCP协议,$ORACLE_HOME/network/admin/samples目录下有样例文件,可供参考。用adapters tnslsnr检查协议程序

  sql*plus运行基本机理:
    在用户输入sqlplus system/manager@test后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假 如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/manager@test.server.com ,然后再到tnsnames.ora文件中找test.server.com网络服务名,这当然找不到了,因为该文件中只有test网络服务名,所以报 错。解决的办法就是将sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数注释掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找 test网络服务名,然后取出其中的host,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。
    另外原则上tnsnames.ora中的配置不区分大小写,但是我的确遇到区分大小写的情况,所以最好将使用的网络服务与tnsnames.ora中配置的完全一样。

#进行查看

listener.ora内容

6、TNS-12203 Error特征:不能与目标连接原因:监听器是否启动;别名是否配置措施:检查监听器是否启动,例如lsnrctl status;检查TNSNAMES.ORA的别名配置

ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor.
该错误表示能在tnsnames.ora中找到网络服务名,但是在tnsnames.ora中指定的SERVICE_NAME与服务器端的SERVICE_NAME不一致。解决的办法是修改tnsnames.ora中的SERVICE_NAME。

(SERVICE_NAME = demo)

 1 # listener.ora Network Configuration File: E:appAdministratorproduct11.2.0dbhome_1NETWORKADMINlistener.ora  
 2 # Generated by Oracle configuration tools.  
 3   
 4 SID_LIST_LISTENER =  
 5   (SID_LIST =  
 6     (SID_DESC =  
 7       (SID_NAME = CLRExtProc)  
 8       (ORACLE_HOME = E:appAdministratorproduct11.2.0dbhome_1)  
 9       (PROGRAM = extproc)  
10       (ENVS = "EXTPROC_DLLS=ONLY:E:appAdministratorproduct11.2.0dbhome_1binoraclr11.dll")  
11     )  
12   )  
13   
14 LISTENER =  
15   (DESCRIPTION =  
16     (ADDRESS = (PROTOCOL = TCP)(HOST = LXL)(PORT = 1521))  
17   )  

7、TNS-12533 Error特征:不能与目标连接原因:非法的address参数,措施:检查TNSNAMES.ORA的ADDRESS参数1)用tnsping net_service_name测试网络服务名是否配置正确!!2)用sqlplus程序通过test网络服务名进行测试,如sqlplus system/manager@test。如果不能连接到数据库,则在tnsname.ora文件中的test网络服务名后面加上sqlnet.ora文件NAMES.DEFAULT_DOMAIN参数的值, 什么情况下会引起oracle自动设置NAMES.DEFAULT_DOMAIN参数?出现这种情况的典型环境为windows的客户端的‘我得电脑à属性à计算机名à更改à其它…à此计算机的主DNS后缀'中设置了‘primary dns suffix',因为在这种情况下安装客户端时,会在sqlnet.ora文件中自动设置NAMES.DEFAULT_DOMAIN参数,或许当把计算机加入域中安装oracle客户端时也会出现这种情况,有条件的话大家可以试一下。我在设置oracle的客户端时一般手工修改tnsnames.ora文件,但是还有许多人喜欢用图形工具配置,该图形工具最终还是修改tnsnames.ora文件,但是它有时会引起其它的问题:在用oracle的图形配置软件'net assistant'或‘Net Configuration Assistant'配置网络服务名时,假如已经设置了‘primary dns suffix',但是在图形配置软件中写的网络服务名的名字中没有‘primary dns suffix',如只是写了test,则图形配置软件会自动在后面加上‘primary dns suffix',使之变为test.testserver.com,并存在tnsnames.ora中,而不管你的sqlnet.ora文件中是否有NAMES.DEFAULT_DOMAIN参数。此时,用图形工具进行测试连接是通过的,但是假如此时sqlnet.ora文件中没有NAMES.DEFAULT_DOMAIN参数,则你在使用网络服务名时应该使用在tnsnames.ora中的test.testserver.com,而不是你在图形配置软件中键入的test。解决的办法为:<1>可以在sqlnet.ora文件中设置NAMES.DEFAULT_DOMAIN= testserver.com,这时你可以用test或test.testserver.com连接数据库<2>在sqlnet.ora文件中不设置NAMES.DEFAULT_DOMAIN参数,在tnsnames.ora文件中将test.testserver.com中的.testserver.com去掉,这时你可以用test连接数据库。

  易混淆术语介绍:
    Db_name:对一个数据库(Oracle database)的唯一标识,该数据库为第一章讲到的Oracle database。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负 担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了Db_domain参数,这样在数据库的标识是由Db_name和 Db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将Db_name和 Db_domain两个参数用’.’连接起来,表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了Db_name。 Db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。

)
)

 

    Db_domain:定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。

#下面这个类似

    Global_name:对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法命令数据库。该值是在创建数据库是决定的,缺省值为Db_name. Db_domain。在以后对参数文件中Db_name与Db_domain参数的任何修改不影响Global_name的值,如果要修改Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO <db_name.db_domain>命令进行修改,然后修改相应参数。

SALES =

    Service_name:该参数是oracle8i新引进的。在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中, 一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库, 而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关 系,即不必Service name 必须与SID一样。

(DESCRIPTION =

    Net service name:网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.176)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)
(SERVICE_NAME = sales)

)

)

客户端完了我们来看服务器端, sqlnet.ora, tnsnames.ora 都是客户端文件.

3 listener.ora

listener监听器进程的配置文件
关于listener进程就不多说了,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener

进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。
Listener.ora文件的例子
#listener.ora
#/u01/app/oracle/product/9.2.0/network/admin/listener.ora
# Generated by Oracle configuration tools.

#下面定义LISTENER进程为哪个实例提供服务

#这里是demo,并且它对应的ORACLE_HOME和GLOBAL_DBNAME

#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做数据库连接
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = mydb)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (SID_NAME = mydb)
    )
  )
#监听器的名字,一台数据库可以有不止一个监听器
#再向下面是监听器监听的协议,ip,端口等,这里使用的tcp1521端口,并且使用的是主机名
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST =  redhat )(PORT = 1521))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
    )
  )
上面的例子是一个最简单的例子,但也是最普遍的。一个listener进程为一个instance(SID)提供服务。

监听器的操作命令

$ORACLE_HOME/bin/lsnrctl start,其他诸如stop,status等。具体敲完一个lsnrctl后看帮助。

上面说到的三个文件都可以通过图形的配置工具来完成配置

$ORACLE_HOME/netca 向导形式的

$ORACLE_HOME/netmgr

profile 配置的是sqlnet.ora也就是名称解析的方式

service name 配置的是tnsnames.ora文件

listeners配置的是listener.ora文件,即监听器进程

具体的配置可以尝试一下然后来看一下配置文件。

这样一来总体结构就有了,是当你输入sqlplussys/oracle@demo的时候

  1. 查询sqlnet.ora看看名称的解析方式,发现是TNSNAME
    2. 则查询tnsnames.ora文件,从里边找demo的记录,并且找到主机名,端口和service_name

  2. 如果listener进程没有问题的话,建立与listener进程的连接。

4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客

户端就连接上了数据库的server process。

  1. 这时候网络连接已经建立,listener进程的历史使命也就完成了。

二 几种连接用到的命令形式

1.sqlplus / as sysdba 这是典型的操作系统认证,不需要listener进程

2.sqlplus sys/oracle 这种连接方式只能连接本机数据库,同样不需要listener进程
3.sqlplussys/oracle@demo这种方式需要listener进程处于可用状态。最普遍的通过网络连接。

以上连接方式使用sys用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态,操作系统认证也不需要数据库可用,普通用户

因为是数据库认证,所以数据库必需处于open状态.
平时排错可能会用到的

1.lsnrctl status查看服务器端listener进程的状态

LSNRCTL> help

The following operations are available

An asterisk (*) denotes a modifier or extended command:

start stop status

services version reload

save_config trace change_password
quit exit set*

show*

LSNRCTL> status

2.tnsping 查看客户端sqlnet.ora和tnsname.ora文件的配置正确与否,及对应的服务器的listener进程的状态。

[oracle@redhat admin]$ tnsping demo

TNS Ping Utility for Linux: Version 9.2.0.4.0 - Production on 07-MAY-2004 23:12:53

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/9.2.0/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.176)(PORT = 1521)))

(CONNECT_DATA = (SERVICE_NAME = demo)))
OK (20 msec)
SQL>show sga 查看instance是否已经启动
SQL> select open_mode from v$database; 查看数据库是打开还是mount状态。

OPEN_MODE

READ WRITE

三 使用hostname访问数据库而不是tnsname的例子(没做成功??)

使用tnsname访问数据库是默认的方式,但是也带来点问题,那就是客户端都是需要配置tnsnames.ora文件的。如果你的数据库服务器地址发生

改变,就需要重新编辑客户端这个文件。通过hostname访问数据库就没有了这个麻烦。
需要修改
1 编辑服务器端listener.ora

#LISTENER.ORA Network Configuration File: /u01/app/oracle/product/9.2.0/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = mydb)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (SID_NAME = mydb)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = redhat )(PORT = 1521))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
    )
  )

2 编辑hosts文件
[root@redhat root]# vi /etc/hosts

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost
192.168.1.176   redhat

3 编辑客户端sqlnet.ora 如果确认不会使用TNSNAME访问的话,可以去掉TNSNAMES
# sqlnet.ora Network Configuration File:
# Generated by Oracle configuration tools.
再次学习oracle的listener,ora配置文件详解。SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (HOSTNAME)

4 不配置Tnsnames.ora文件,删除也无所谓。

下面就是网络和操作系统的配置问题了,怎么样能够解析我的主机名的问题了

可以通过下面的方式连接

sqlplussys/oracle@redhat
这个redhat是主机名
这样的话,会连接redhat这台服务器,并且由listener来确定你所要连接的service_name。

[oracle@redhat oracle]$ sqlplusmouse/mouse@redhat

SQL*Plus: Release 9.2.0.4.0 - Production on Fri May 7 23:54:49 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

ERROR:
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect
descriptor
不成功
???????????????????????????????????????

常见故障解决办法:

TNS-12154 (ORA-12154):TNS:could not resolve service name

该错误表示用于连接的网络服务名在tnsnames.ora文件中不存在.

sql*plus运行基本机理:

在用户输入sqlplussystem/manager@demo后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由sqlplussystem/manager@demo 自动变为sqlplussystem/manager@demo.server.com,然后再到tnsnames.ora文件中找demo.server.com网络服务名,这当然找不到了,因为该文件中只有demo网络服务名,所以报错。解决的办法就是将sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数注释掉即可,

如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找 demo网络服务名,然后取出其中的host,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。

另外原则上tnsnames.ora中的配置不区分大小写,但是我的确遇到区分大小写的情况,所以最好将使用的网络服务与tnsnames.ora中配置的完全一样。

ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor.

该错误表示能在tnsnames.ora中找到网络服务名,但是在tnsnames.ora中指定的SERVICE_NAME与服务器端的 SERVICE_NAME不一致。解决的办法是修改tnsnames.ora中的SERVICE_NAME

本文由美高梅网站是多少发布于美高梅-数据,转载请注明出处:再次学习oracle的listener,ora配置文件详解

上一篇:Oracle中插入特殊字符,在oracle中插入单引号与 下一篇:没有了
猜你喜欢
热门排行
精彩图文