oracle_logo_10g_db

原文:http://www.chenjunlu.com/2011/05/introduction-of-oracle-network-configuration-files/

1.概述

在 Oracle 安装目录$HOME/network/admin下,,经常看到 sqlnet.ora tnsnames.ora listener.ora 这三个文件,除了 tnsnames.ora,其他两个文件详细的用途很多人都不太了解。
sqlnet.ora 用在 Oracle client端,用于配置连接服务端 Oracle 的相关参数。
tnsnames.ora 用在 Oracle client 端,用户配置连接数据库的别名参数,就像系统中的hosts文件一样。
listener.ora 用在 Oracle server 端,配置 Oracle 服务端程序的监听办法,比如限制某些 ip 等参数。
在安装目录 $HOME/network/admin/samples 下,会看到这三个文件的示例文件,里面会有相关参数的说明和用法,如果遇到什么问题,大家可以对照这些示例文件中相关参数的说明进行解决。
如果连接数据库出了什么问题,在保证网络正常,没有防火墙干扰的情况下,查找问题的步骤是:
  1. 在客户端顺序检查 sqlnet.ora,tnsnames.ora 是否有问题。
  2. 在服务器端检查 listener.ora 配置,并且保证监听程序启动,数据库服务加载。

2.认识 sqlnet.ora 文件

下面只讲述几个常用参数配置,详细的资料,大家可以参考 sqlnet.ora 示例文件。
sqlnet.ora 可以删除,这样在 Oracle 客户端连接数据库的时候,默认采用 tnsnames.ora 文件中的配置。
1).NAMES.DEFAULT_DOMAIN
域名 domain 定义,在你用 sqlplus 访问数据库的时候,会在 tns 别名后面加上”.domain”
示例:
NAMES.DEFAULT_DOMAIN=com
tnsnames.ora中的tns定义如下:
local_dev =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
在客户端执行 sqlplus 连接命令的时候,可能会出现如下错误信息:
#sqlplus username/password@local_dev
“ORA-12154: TNS: 无法处理服务名”或者”ORA-12154: TNS:could not resolve service name”
因为 sqlplus username/password@local_dev 的时候,将 tns 别名“local_dev”转换成了“local_dev.com”,所以 local_dev.com 在 tnsnames.ora 中找不到,就报错了。
修改 tnsnames.ora 文件中的定义如下:
local_dev.com =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
再执行 sqlplus username/password@local_dev,连接成功。
2).NAMES.DIRECTORY_PATH
定义了在客户端连接数据库时,采用什么样的匹配方式。
示例 sqlnet.ora 文件内容如下:
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
那么在客户端执行 sqlplus username/password@local_dev 连接数据库的时候,
首先采用 tnsnames.ora 的别名配置连接数据库;如果连接上;
再采用 ONAMES 进行解析,最后采用主机名进行解析;
ONAMES表示 Oracle 使用自己的名称服务器(Oracle Name Server)来解析,目前 Oracle 建议使用轻量目录访问协议 LDAP 来取代 ONAMES;
HOSTNAME 表示使用 hosts 文件,DNS,NIS等来解析;
3).SQLNET.AUTHENTICATION_SERVICES
定义登录数据库的认证方式。
NONE 表示 Oracle 数据库身份验证,NTS 表示操作系统身份验证,两种方式可以并用。
可以设置成 SQLNET.AUTHENTICATION_SERVICES=(NONE,NTS) 先后顺序表明验证的优先方式。
示例 sqlnet.ora 内容如下:
SQLNET.AUTHENTICATION_SERVICES=(NONE)
在命令行上执行如下命令:
sqlplus “/ as sysdba”时,执行失败。
提示错误信息ORA-01031: insufficient privileges
这个参数默认没有设置。

3.认识 tnsnames.ora 文件

提供了客户端连接某个数据库的详细信息,主机地址,端口,数据库实例名等。
下面给出一个示例来说明问题:
local_dev =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
PROTOCOL 参数一般是TCP,可以根据服务器情况选择一种配置方式。
HOST 一般是ip地址,也可以是主机名,这个主机名字只要能用 ping hostname 通就行,一般在客户端系统的 host 文件上配好主机名和ip地址的映射关系。
ORT 标准是1521,根据服务器端的监听端口而定。
SERVICE_NAME 就是数据库的服务名,用system用户登陆后,sqlplus> show parameter service_name命令查看。
这个配置文件平时大家都用得比较多,一般人都会,相信不会有太大问题。

4.认识 listener.ora 文件

tnslsnr 进程是监听、并接受远程连接数据库请求的监听进程,listener.ora 是 tnslsnr 进程的配置文件,监听的参数都是从该配置文件中读取。
该文件位于服务端,如果只安装 Oracle 客户端,一般不存在这个文件。
如果你只需要在本地连接数据库,不接受远程连接,那么也不需要启动 tnslsnr 进程,也不需要去维护listener.ora文件。
启动监听进程的命令,在命令模式下,执行 lsnrctl start 命令就启动了监听进程 tnslsnr。
监听可以有多个,也就是说,可以同时监听多个 Oracle 实例,可以在 listener.ora 中定义多个监听器进行监听。
下面给出一个简单的示例 listener.ora 文件中的内容:
LISTENER_CSB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.70.9.14)(PORT = 1621))
)
)
)
SID_LIST_LISTENER_CSB =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u02/oracle/app/oracle/product/10.2.0/db)
(SID_NAME = zjdevcsb)
)
)
#############################################
LISTENER_CSA =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.70.9.14)(PORT = 1521))
)
)
)
SID_LIST_LISTENER_CSA =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u02/oracle/app/oracle/product/10.2.0/db)
(SID_NAME = zjdevcsa)
)
)
在上面示例中:
1). LISTENER_CSB,LISTENER_CSA 定义了监听器的两个监听名字,和这两个监听器监听的参数:ip, port 等。
2). SID_LIST_LISTENER_CSB,SID_LIST_LISTENER_CSA 定义了两个监听服务,服务名字格式 SID_LIST_ ,lsnrname 就是上面两个监听器的名字,指定了这个服务将会接受的服务将提交给那个监听器;监听的实例名 zjdevcsb,zjdevcsa 是在 tnsnames.ora 文件中需要指定的 SERVICE_NAME 参数对应。
详细的参数说明可以查看示例的 listener.ora 文件。

5. Oracle 用户登录主机

1). 启动数据库实例
首先执行命令 sqlplus “/ as sysdba” 用数据库系统管理员角色登录,然后执行 startup 启动数据库实例,关闭数据库实例执行用 shutdown 命令。如果不需要从远程连接数据库,那么你就可以在本机登录数据库了。执行 sqlplus username/password 就可以正确登录数据库。
2). 监听
启动监听,执行命令 lsnrctl start,可以用 lsnrctl status 查看监听状态,如果监听成功启动,那么就可以在远程连接数据库了,执行命令 sqlplus username/password@tnsname;
关闭监听,执行命令 lsnrctl stop。
3). 远程连接数据库
当你执行命令 sqlplus username/password@tnsname 的时侯,一般处理过程如下:
  1. 查询 sqlnet.ora 看看名称的解析方式,发现是 TNSNAME,或者 hostname。
  2. 则查询 tnsnames.ora 文件,从里边找 tnsname 的记录,并且找到主机名,端口和 service_name。
  3. 如果 listener 进程没有问题的话,建立与 listener 进程的连接。
  4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener 采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的 server process。
  5. 这时候网络连接已经建立,listener 进程的历史使命也就完成了。
如果在连接数据库的时候,出现什么错误,可以按照上面的顺序查找相应的配置,解决问题。
几种连接数据库用到的命令形式:
  • sqlplus “/ as sysdba” 这是典型的操作系统认证,不需要 listener 进程,数据库即使不可用也可以登录。
  • sqlplus username/password 不需要 listener 进程,登录本机数据库,数据库实例启动即可。
  • sqlplus username/password@tnsname 需要 listener 进程,最常见的远程登录模式,需要启动数据库实例和 listener 进程。

6. 本文涉及的相关术语

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