一、sqlnet.ora
sqlnet.ora用在oracle client端,用于配置客户端连接服务端oracle的相关参数。
读取该文件路径与tnsnames.ora一样,如果装了oracle服务端默认是%ORACLE_HOME%\NETWORK\ADMIN,可以通过TNS_ADMIN环境变量配置。
1).NAMES.DEFAULT_DOMAIN:域名domain定义,在你用sqlplus访问数据库的时候,会在tns别名后面加上".domain"
示例:.NAMES.DEFAULT_DOMAIN=.com
在客户端执行命令:sqlplus username/password@local_dev的时候,会出现如下错误信息: "ORA-12154: TNS: 无法处理服务名"或者"ORA-12154: TNS:could not resolve service name"这样的错误信息。因为sqlplus username/password@orcl的时候,将tns别名“orcl”转换成了“orcl.com”,所以orcl.com在tnsnames.ora中找不到,就报错了。
修改tnsnames.ora中的定义如下:
ORCL.com =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.147)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
再执行sqlplus username/password@orcl连接成功。
2)NAMES.DIRECTORY_PATH:定义了在客户端连接数据库时,采用什么样的匹配方式。
示例:
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT, HOSTNAME)
那么在客户端执行sqlplus username/password@local_dev连接数据库的时,首先采用tnsnames.ora的别名配置连接数据库;如果连接不上;再采用EZCONNECT进行解析,最后采用主机名进行解析。
当然这里配置的都是远程连接方式:
TNSNAMES:通过tnsnames.ora文件连接,格式
username/password@tnsname
EZCONNECT:只需要配置sqlnet.ora的上述属性,打开服务端监听器。格式如下:
//这里service_name就是listener.ora中的global_dbname,这个必须有后面的instance_name可有可无
username/password@[//]host[:port][/service_name][/instance_name]
HOSTNAME:这个方式用的少,不介绍
上述的都是通过网络连接,需要oracle服务器启动listener服务。如果是连接本地数据库的话,ip地址明显可以省略了,sid的话,本地的注册表HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraDb11g_home1中的ORACLE_SID参数或者系统参数的ORACLE_SID会提供,因此也可以省略。
这时候直接输 sqlplus username/password就能登录
或者sqlplus / as sysdba这是用操作系统认证的方式登录
3)SQLNET.AUTHENTICATION_SERVICES:定义登录数据库的认证方式,这个参数默认没有设置。 示例:SQLNET.AUTHENTICATION_SERVICES=(NONE,NTS)
NONE表示Oracle数据库身份验证,NTS表示操作系统身份验证,两种方式可以并用,先后顺序表明验证的优先方式。
4)tcp.validnode_checking=yes:表示启用客户端的IP检查,非法的IP将被拒绝访问Oracle。
5)tcp.invited_nodes=(IP1,IP2,IP3...):表示允许哪些IP访问Oracle。
6)tcp.excluded_nodes=(IP1,IP2,IP3...):表示拒绝哪些IP访问Oracle。
二、tnsnames.ora
tnsnames.ora用在oracle client端,tnsnames.ora文件用于TNSNAMES连接方式,该方式是通过网络的远程连接方式。所以连接本地oracle服务的时候,如果关闭了监听服务是连接不了的。
如果本地安装了oracle服务端,则默认读取%ORACLE_HOME%\NETWORK\ADMIN下的tnsnames.ora文件。一般我们会通过配置系统变量TNS_ADMIN来读取客户端下的tnsnames.ora文件。
可以用tnsping命令查看tnsname状态
文件配置示例:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.147)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
PROTOCOL参数一般是TCP,可以根据服务器情况选择一种配置方式。
HOST 一般是ip地址,如果是主机名,则应该在客户端系统的host文件上配好主机名和ip地址的映射关系。
PORT 标准是1521,根据服务器端的监听端口而定。
SERVICE_NAME 就是数据库的服务名。
三、listener.ora
tnslsnr是服务器进程,用于监听、并接受远程连接数据库请求的监听进程。listener.ora是tnslsnr进程的配置文件,监听的参数都是从该配置文件中读取,该文件位于服务端。如果你只需要在本地连接数据库,不接受远程连接,那么也不需要启动tnslsnr进程,也不需要去维护listener.ora文件。
启动监听进程的命令,在命令模式下,执行lsnrctl(listener control好记一点) start命令就启动了监听进程tnslsnr,lsnrctl status可以查看监听程序状态,或者在服务中找到OracleOraDb11g_home1TNSListener服务启动它。
示例:
//这里定义监听器为那些实例服务
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
// 这个是监听的全局数据库名,与tnsnames.ora文件中SERVICE_NAME对应,可能当时设置这个参数的目的是不让服务端的sid暴露,这个随便取名称跟sid没关系的
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /oracle/product/10.2.0/db_1)
(SID_NAME = orcl)
)
)
//这里定义监听器 所监听的位置(可以不止一个),配置地址、端口
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.147)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
LISTENER部分包含协议地址列表,每个实例一个入口。
SID_LIST_LISTENER部分标识全局数据库名称、标识监听程序正在服务的每个实例的Oracle软件主目录以及实例或SID。
当你执行命令sqlplus username/password@tnsname时,一般处理过程如下:
1)查询sqlnet.ora看看名称的解析方式,发现是TNSNAME,或者hostname。
2)则查询tnsnames.ora文件,从里边找tnsname的记录,并且找到主机名,端口和service_name。
3)如果listener进程没有问题的话,建立与listener进程的连接。
4)根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。
5)这时候网络连接已经建立,listener进程的历史使命也就完成了。
几种连接数据库用到的命令形式:
1)sqlplus "/ as sysdba" 这是典型的操作系统认证,不需要listener进程,数据库即使不可用也可以登录。
2)sqlplus username/password 不需要listener进程,登录本机数据库,数据库实例启动即可。
3)sqlplus username/password@tnsname需要listener进程,最常见的远程登录模式,需要启动数据库实例和listener进程。