listener.ora、tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,都是放在$ORACLE_HOME/NETWORK/ADMIN目录下(Linux系统为“/”,Windows系统为“\")。其中listener.ora是和数据库服务器端相关,而tnsnames.ora和sqlnet.ora这2个文件不仅仅关系到服务器端,主要的还是和客户端关系紧密(#表注释)。
1.sqlnet.ora
通过这个文件来决定如何查找一个连接中出现的连接字符串
示例文件:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES,EZCONNECT)
#NAMES.DEFAULT_DOMAIN = oracle.com
内容说明:
#表明用户连接数据库用哪种验证方式<wbr><wbr></wbr></wbr>主要两种:
(1)NTS:表示系统身份验证<wbr><wbr>---</wbr></wbr>用户名和口令可输可不输<wbr><wbr>conn<wbr><wbr>/ as<wbr><wbr>sys dba;<br> (2)NONE:oralce</wbr></wbr></wbr></wbr></wbr></wbr>数据库身份验证---必须输入用户名和口令<wbr><wbr>conn<wbr><wbr>system/oracle as sysdba;<br><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>在unix环境下可能会有问题,一般在unix下可以去掉这个配置。
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES,EZCONECT)——表示将首先利用tnsnames进行解析;如果tnsnames解析不到,将使用hostname解析;如果hostname解析不到,将采用onames进行解析;最后使用EZCONNECT解析。例如我们客户端输入:SQL> conn [email=system/oracle@orcl23]system/oracle@orcl23[/email]<wbr><wbr>(orcl123</wbr></wbr>是网络服务名)那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的IP地址然后去连接这个IP上global_name=orcl123这个实例,当然我这里orcl并不是一个主机名。
被注释掉的NAMES.DEFAULT_DOMAIN = oracle.com——表示采用默认的域名为oracle.com,在tnsnames.ora中如果配置对应的解析,如果原来的数据库别名是oralocal(即网络服务名),那么,当启用这个参数后,在tnsnames中的配置要改成oralocal.oracle.com。在使用tnsping时或者sqlplus登录时,只需写前面的别名,系统会自动加上后面的域名来进行解析。
2.tnsnames.ora
这个文件位于客户端(服务器端也存在的,表示客户端与服务器端位于同一台主机),记录客户端访问数据库的本地配置,其实就是定义网络服务,只有当sqlnet.ora中有“NAMES.DIRECTORY_PATH= (TNSNAMES)”这样的字样时,也就是客户端解析连接字符串的顺序中有TNSNAMES时,才会尝试使用这个文件。
示例文件:
ORCL123 =<wbr>#</wbr>网络服务名--------------配置文件里存在的一个网络服务名
<wbr><wbr>(DESCRIPTION =<br><wbr><wbr><wbr><wbr>(ADDRESS_LIST =<br><wbr><wbr><wbr><wbr><wbr><wbr>(ADDRESS = (PROTOCOL = TCP)(HOST = zhaomengbin)(PORT = 1521))<br><wbr><wbr><wbr><wbr>)<wbr><wbr>#</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>协议是TCP,要连接的服务器的计算机名zhaomegnbin,或为该主机对应的IP,端口号为1521
<wbr><wbr><wbr><wbr>(CONNECT_DATA =<br><wbr><wbr><wbr><wbr><wbr><wbr>(SERVICE_NAME = orcl)<br><wbr><wbr><wbr><wbr>)<br><wbr><wbr>)<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>EXTPROC_CONNECTION_DATA =
<wbr><wbr>(DESCRIPTION =<br><wbr><wbr><wbr><wbr>(ADDRESS_LIST =<br><wbr><wbr><wbr><wbr><wbr><wbr>(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC1))<br><wbr><wbr><wbr><wbr>)<br><wbr><wbr><wbr><wbr>(CONNECT_DATA =<br><wbr><wbr><wbr><wbr><wbr><wbr>(SID = PLSExtProc)<br><wbr><wbr><wbr><wbr><wbr><wbr>(PRESENTATION = RO)<br><wbr><wbr><wbr><wbr>)<br><wbr><wbr>)<br> 3<span style="color:#ED1C24; word-wrap:normal; word-break:normal; line-height:24px">listener.ora</span><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr>listener.ora文件中存放了客户机与服务器连接所需要的监听地址,以及服务器启动监听进程时的信息。一个完整的listener.ora文件样式如下:<br></wbr>
SID_LIST_LISTENER =
<wbr>(SID_LIST =<br><wbr><wbr><wbr>(SID_DESC =<br><wbr><wbr><wbr><wbr><wbr>(SID_NAME = PLSExtProc)<br><wbr><wbr><wbr><wbr><wbr>(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)<br><wbr><wbr><wbr><wbr><wbr>(PROGRAM = extproc)<br><wbr><wbr><wbr>)<br><wbr>)<br> LISTENER =<br><wbr>(DESCRIPTION_LIST =<br><wbr><wbr><wbr>(DESCRIPTION =<br><wbr><wbr><wbr><wbr><wbr>(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))<br><wbr><wbr><wbr>)<br><wbr>)<br> 以上是本人本机上的一个监听文件,下面就该监听文件的各个参数的作用作个描述:<br> LISTENER<wbr><wbr><wbr><wbr><wbr><wbr>指出一个监听器定义的起始点。它实际上是正被定义的当前监听器的名称。默认的名称是LISTENER。<br> DESCRIPTION<wbr><wbr><wbr>描述每个监听位置<br> ADDRESS_LIST<wbr><wbr>含有与监听器正在监听的那些位置有关的地址信息<br> PROTOCOL<wbr><wbr><wbr><wbr><wbr><wbr>指定用于本监听位置的协议<br> HOST<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>保存监听器所驻留在的那台计算机的名称<br> PORT<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>含有监听器正在上面监听的地址<br> SID_LIST_LISTENER<wbr>定义配置监听器所针对的ORACLE服务的列表<br> SID_DESC<wbr><wbr><wbr><wbr><wbr><wbr>描述每个Oracel SID<br> GLOBAL_DBNAME<wbr>标识全局数据库名称。本项应该与当前Oracle服务的init.ora文件中的SERVICE_NAMES项一致<br> ORACLE_HOME<wbr><wbr><wbr>给出服务器上Oracle可执行程序的位置<br> SID_NAME<wbr><wbr><wbr><wbr><wbr><wbr>含有用于本Oracle实例的Oracle SID的名称</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
Lsnrctl命令用来管理Oracle监听器,是一个命令行界面。想调用这个命令行工具,在命令行键入lsnrctl即可。可以在LSNRCTL>提示符下键入help来显示这些命令的一份清单。
Services<wbr><wbr><wbr><wbr><wbr><wbr><wbr>列举出服务的一个汇总表及为每个协议服务处理程序所建立和拒绝的连接信息个数<br> Start listener<wbr>启动指定的监听器<br> Status listener 显示指定监听器的状态<br> Stop listener<wbr><wbr>关闭指定的监听器<br> Trace<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>打开监听器的跟踪特性<br> Version<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>显示Oracle Net软件与协议适配器的版本<br> Change_password 允许用户修改关闭监听器所需要的密码<br> Reload<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>重新读取listener.ora文件,但不关闭监听器。如果该文件发生了变化,重新刷新监听器。<br> Save_config<wbr><wbr><wbr><wbr>当从lsnrctl工具中对listener.ora文件进行了修改时,复制一个叫做listener.bak的listener.ora文件<br> Exit<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>退出lsnrctl实用工具<br> Quit<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>执行和exit相同的功能<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
以上三个网络配置文件可以通过图形化配置工具进行相应配置。如在Linux下,
$netmgr #在Windows下为Net Manager
打开后可以看到一个窗口,其中,
profile 配置的是sqlnet.ora也就是名称解析的方式
service name 配置的是tnsnames.ora文件
listeners配置的是listener.ora文件,即监听器进程。
通过以上解读,就可以比较清晰地了解其运行机制了。
当你输入sqlplus sys/oracle@orcl的时候
1. 查询sqlnet.ora看看名称的解析方式,发现是TNSNAME
2. 则查询tnsnames.ora文件,从中寻找orcl的记录,并且找到主机名,端口和service_name
3. 如果listener进程没有问题的话,建立与listener进程的连接。
4.根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。
5.此时网络连接已经建立,listener进程的历史使命也就完成了。
几种连接用到的命令形式
1.sqlplus / as sysdba 这是典型的操作系统认证,不需要listener进程
2.sqlplus sys/oracle 这种连接方式只能连接本机数据库,同样不需要listener进程
3.sqlplus sys/oracle@orcl 这种方式需要listener进程处于可用状态。最普遍的通过网络连接。
以上连接方式使用sys用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态,操作系统认证也不需要数据库可用,普通用户因为是数据库认证,所以数据库必需处于open状态。
init.ora中的Remote_Login_Passwordfile对身份验证的影响
<wbr><wbr><wbr>三个可选值:</wbr></wbr></wbr>
<wbr><wbr><wbr>NONE:默认值,指示Oracle系统不使用密码文件,通过操作系统进行身份验证的特权用户拥有SYSORA和SYSOPER权限</wbr></wbr></wbr>
<wbr><wbr><wbr>EXCLUSIVE:</wbr></wbr></wbr>
<wbr><wbr><wbr>1.表示只有一个数据库实例可以使用密码文件</wbr></wbr></wbr>
<wbr><wbr><wbr>2.允许将SYSORA和SYSOPER权限赋值给SYS以外的其它用户</wbr></wbr></wbr>
<wbr><wbr><wbr>SHARED:</wbr></wbr></wbr>
<wbr><wbr><wbr>1.表示可以有多个数据库实例可以使用密码文件</wbr></wbr></wbr>
<wbr><wbr><wbr>2.不允许将SYSORA和SYSOPER权限赋值给SYS以外的其它用户</wbr></wbr></wbr>
<wbr><wbr><wbr>所以,如果要以操作系统身份登录,Remote_Login_Passwordfile应该设置为NONE</wbr></wbr></wbr>
<wbr><wbr><wbr>当登录用户不是ORA_DBA组和ORA_OPER组成员时,登录数据库需要在Oracle中创建当前操作系统用户相同的用户名,如果当前用户是域用户,则名称为:domainname\yourname,如果是本地计算机用户,则名称为:computername\yourname</wbr></wbr></wbr>
<wbr><wbr><wbr>创建方法:</wbr></wbr></wbr>
<wbr><wbr><wbr>create "domainname\yourname" identified externally;</wbr></wbr></wbr>
<wbr><wbr><wbr>操作系统,修改HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0下面添加AUTH_PREFIX_DOMAIN,值设为FALSE,在创建Oracle用户时可以忽略掉域名</wbr></wbr></wbr>
<wbr><wbr><wbr>这种方式下,init.ora中有一个参数将影响数据库如何匹配一个windows用户和Oracle用户os_authent_prefix = ""</wbr></wbr></wbr>
<wbr><wbr><wbr>缺省为空,Oracle8i以前,无该参数,而使用OPS$作为用户名前缀.(Oracle用户名最大长度限制为30个字符)</wbr></wbr></wbr>
域名解析分析:相关文件为
/etc/hosts<wbr>#linux系统</wbr>
C:\windows\system32\drivers\etc\hosts #windows系统
客户端需要写入数据库服务器IP地址和主机名的对应关系。如果同时有私有IP和Internet上公有IP,私有IP写在前面,公有IP写在后面。
如:
11.0.17.136 oracle
有时候tnsping数据库服务器别名显示是成功的,但是sqlplus username/passwd @servicename不通,jdbc thin link也不通,原因可能是DNS服务器里没有设置这个服务器IP地址和主机名的对应关系,本人就遇到过类似问题。
UNIX下ORACLE多数据库的环境,OS客户端需要配置下面两个环境变量来指定默认的目标数据库
<wbr><wbr><wbr><wbr>ORACLE_SID=appdb;export ORACLE_SID</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>TWO_TASK=appdb;export TWO_TASK</wbr></wbr></wbr></wbr>
相关命令:
$lsnrctl start listenername #启动监听程序listenername
$lsnrctl status listenername #查看listenername的状态
$lsnrctl stop listenername #停止listenername监听
$tnsping tnsname #测试网络服务名tnsname是否可用