1、Oracle 监听配置文件最近看到好多人说到 tns 或者数据库不能登录等问题,就索性总结了下面的文档。首先来说 Oracle 的网络结构,往复杂处说能加上加密、LDAP 等等。这里不做讨论,重点放在基本的网络结构也就是我们最常用的这种情况。 三个配置文件重点:三个文件的作用和使用。listener.ora、sqlnet.ora、 tnsnames.ora,都是放在$ORACLE_HOMEnetworkadmin目录下。sqlnet.ora作用类似于 linux 或者其他 unix 的 nsswitch.conf 文件, 通过这个文件来决定怎么样找一个连接中出现的连接字符串。例如我们客户端输入
2、 sqlplus sys/oracleorcl假如我的 sq14lnet.ora 是下面这个样子:SQLNET.AUTHENTICATION_SERVICES= (NTS)NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)那么,客户端就会首先在 tnsnames.ora 文件中找 orcl 的记录。如果没有相应的记录则尝试把 orcl 当作一个主机名,通过网络的途径去解析它的 ip 地址然后去连接这个 ip 上GLOBAL_DBNAME=orcl 这个实例,当然我这里 orcl 并不是一个主机名如果我是这个样子:NAMES.DIRECTORY_PATH= (TN
3、SNAMES)那么客户端就只会从 tnsnames.ora 查找 orcl 的记录。括号中还有其他选项,如 LDAP等并不常用。附注:没有 SQLNET.AUTHENTICATION_SERVICES= (NTS)这条语句,用户登录时就不经过 OS 认证,而需要通过用户名/密码认证登录。#-Tnsnames.ora客户端这个文件类似于 unix 的 hosts 文件,提供的 tnsname 到主机名或者 ip 的对应。只有当sqlnet.ora 中类似 NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有 TNSNAMES 时,才会尝试使
4、用这个文件。例子中有两个,ORCL 对应的本机, SALES 对应的另外一个 IP 地址,里边还定义了使用专用服务器还是共享服务器模式进行连接,一句一句的说/*你所要连接的时候输入得 TNSNAME*/ORCL =(DESCRIPTION =(ADDRESS_LIST =/*下面是这个 TNSNAME 对应的协议,主机和端口;127.0.0.1 表示本地 IP*/(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)(CONNECT_DATA =/*使用专用服务器模式去连接需要跟服务器的模式匹配,如果没有就根据服务器的模式自动调节*
5、/(SERVER = DEDICATED)/*对应 service_name,使用 show parameter service_name;命令进行查看*/(SERVICE_NAME = orcl)/*下面这个类似*/SALES =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521)(CONNECT_DATA =(SERVER = DEDICATED) -专用服务器模式(SERVICE_NAME = sales)#-客户端完了我们来看服务器端。listener.
6、ora服务器listener 监听器进程的配置文件。关于 listener 进程就不多说了,接受远程对数据库的接入申请并转交给 oracle 的服务器进程。所以如果不是使用远程连接,listener 进程就不是必需的,同样的如果关闭 listener进程并不会影响已经存在的数据库连接。Listener.ora 文件的例子:#listener.ora Network Configuration File: #E:%ORACLE_HOME%NETWORKADMINlistener.ora# Generated by Oracle configuration tools.#下面定义 LISTENER
7、 进程为哪个实例提供服务#这里是 ORCL,并且它对应的 ORACLE_HOME 和 GLOBAL_DBNAME#其中 GLOBAL_DBNAME 不是必需的除非使用 HOSTNAME 做数据库连接SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = boway)(ORACLE_HOME = E:oracleproduct10.1.0Db_2)(SID_NAME = ORCL)#监听器的名字,一台数据库可以有不止一个监听器#再向下面是监听器监听的协议,IP 和端口,这里使用的 tcp1521 端口,并且使用的是主机名LISTENER
8、 =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521)上面的例子是一个最简单的例子,但也是最普遍的。一个 listener 进程为一个instance(SID)提供服务 。监听器的操作命令:$ORACLE_HOME/bin/lsnrctl start,其他诸如 stop,status 等。具体敲完一个 lsnrctl 后看帮助。上面说到的三个文件都可以通过图形的配置工具来完成配置$ORACLE_HOME/netca 向导形式的$ORACLE_HOME/netmgr本人比较习惯 netmgr,profile 配
9、置的是 sqlnet.ora 也就是名称解析的方式service name 配置的是 tnsnames.ora 文件listeners 配置的是 listener.ora 文件,即监听器进程具体的配置可以尝试一下然后来看一下配置文件。这样一来总体结构就有了,是当你输入 sqlplus sys/oracleorcl 的时候:1. 查询 sqlnet.ora 看看名称的解析方式,发现是 TNSNAME;2. 则查询 tnsnames.ora 文件,从里边找 orcl 的记录,并且找到主机名,端口和service_name;3. 如果 listener 进程没有问题的话,建立与 listener 进
10、程的连接;4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener 采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的 server process;5. 这时候网络连接已经建立,listener 进程的历史使命也就完成了。#- 几种连接用到的命令形式1.sqlplus / as sysdba 这是典型的操作系统认证,不需要 listener 进程2.sqlplus sys/oracle 这种连接方式只能连接本机数据库,同样不需要 listener 进程3.sqlplus sys/oracleorcl 这种方式需要 listener 进程处于可用
11、状态。最普遍的通过网络连接。以上连接方式使用 sys 用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态,操作系统认证也不需要数据库可用,普通用户因为是数据库认证,所以数据库必需处于 open 状态。 平时排错可能会用到的1lsnrctl status 查看服务器端 listener 进程的状态LSNRCTL helpThe following operations are availableAn asterisk (*) denotes a modifier or extended command:start stop statusservices version reloadsa
12、ve_config trace change_passwordquit exit set*show*LSNRCTL status2tnsping 查看客户端 sqlnet.ora 和 tnsname.ora 文件的配置正确与否,及对应的服务器的listener 进程的状态。C:tnsping orclTNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 16-8 月 -2005 09:36:08Copyright (c) 1997, 2003, Oracle. All rights reserved.Us
13、ed parameter files:E:oracleproduct10.1.0Db_2networkadminsqlnet.oraUsed TNSNAMES adapter to resolve the aliasAttempting to contact (DESCRIPTION = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl)OK (20 msec)3.SQLshow sg
14、a 查看 instance 是否已经启动SQL select open_mode from v$database; 查看数据库是打开还是 mount 状态。OPEN_MODE-READ WRITE#- 使用 hostname 访问数据库而不是 tnsname 的例子使用 tnsname 访问数据库是默认的方式,但是也带来点问题,那就是客户端都是需要配置 tnsnames.ora 文件的。如果你的数据库服务器地址发生改变,就需要重新编辑客户端这个文件。通过 hostname 访问数据库就没有了这个麻烦。需要修改服务器端 listener.ora#监听器的配置文件 listener.ora#使用
15、host naming 则不再需要 tnsname.ora 文件做本地解析# listener.ora Network Configuration File: d:%ORACLE_HOME%NETWORKADMINlistener.ora# Generated by Oracle configuration tools.SID_LIST_LISTENER =(SID_LIST =(SID_DESC =# (SID_NAME = PLSExtProc)(SID_NAME = orcl)(GLOBAL_DBNAME = boway)(ORACLE_HOME = d:oracleproduct10.
16、1.0db_1)# (PROGRAM = extproc)LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521)客户端 sqlnet.ora 如果确认不会使用 TNSNAME 访问的话,可以去掉 TNSNAMES 。# sqlnet.ora Network Configuration File: d:%ORACLE_HOME%NETWORKADM
17、INsqlnet.ora# Generated by Oracle configuration tools.SQLNET.AUTHENTICATION_SERVICES= (NTS)NAMES.DIRECTORY_PATH= (HOSTNAME)Tnsnames.ora 文件不需要配置,删除也无所谓。下面就是网络和操作系统的配置问题了,怎么样能够解析我的主机名的问题了。可以通过下面的方式连接sqlplus sys/oracleboway这样的话,会连接 boway 这台服务器,并且 listener 来确定你所要连接的service_name。listener.ora 与 tnsnames.o
18、ra 及 sqlnet.ora listener.ora 对应的是服务器上的监听。tnsnames.ora 对应的是客户端上的连接配置可以说在本地的数据库不用开监听 listener.ora 就可以访问数据库( 访问数据库时不带 dbname ),但是访问远程数据库的话,远程数据库一定要开监听。tsnnames.ora注意:tsnnames.ora 里 DESCRIPTION 前面那个 oratest 不一定要跟里面的service_name 一样,它只是给这个连接串起的一个别名,可以任意取名字。比如ORATESTa =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS
19、 = (PROTOCOL = TCP)(HOST = 192.168.2.195)(PORT = 1521)(CONNECT_DATA =(SERVICE_NAME = oratest)注意:改 oratest 为 oratesta 以后,即修改 tnsnames.ora 后,要重新进入 SQL*Plus 进行连接。平时的连接 c:sqlplus aa/aa123oratest 可以改为直接用连接字符串,例如:c:sqlplus aa/aa123(DESCRIPTION = (ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST =192.168.2.19
20、5)(PORT = 1521)(CONNECT_DATA=(SERVICE_NAME =oratest)监听 listener.ora监听的启动 lsnrctl start 并不会去找 sid_name 是否存在,甚至数据库是否启动都不理会。甚至试验将数据库 shutdown 掉,lsnrctl start 都是成功的不会提示错误,或者数据库运行状态下将 listener.ora 的内容改一下比如改 sid_name 为不存在 sid,然后 lsnrctl start 也不会出错,这就说明只有在连接的时候才会去找 sid_name,才会有错误提示。另外,listener.ora 内容修改以后,
21、要重新启动修改的内容才生效。sqlnet.oraSQLNET.AUTHENTICATION_SERVICES= (NTS,NONE)当为 NTS 的时候是 OS 验证,为 NONE 的时候是采用密码文件认证方式 。试验如下:环境:windows修改了 SQLNET.AUTHENTICATION_SERVICES= (NONE) 但是SQL CONN AA/AA123已连接。照样连接成功SQLCONN SYS/SYS123 AS SYSDBA已连接。 也是连接成功SQL conn /as sysdbaERROR:ORA-01031: insufficient privileges警告:您不再连接到 ORACLE。这就说明当值为 NONE 的时候,是必须要输入用户名和密码的,这就是密码认证方式。注意:1、修改 sqlnet.ora 是不需要重新启动数据库的2、在其他 Linux/Nuix 平台下跟别的参数有关,跟 Windows 环境下不同。