oracle_listener_详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle监听-提纲
o ORACLE工作机制o ORACLE监听参数o ORACLE监听功能o ORACLE监听配置o ORACLE网络构架o ORACLE精简版构造o ORACLE常见问题
ORACLE工作机制
o从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址),那么这个请求都会通过DNS服务器或HOST文件的服务名解析然后传送到ORACLE监听进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请求
o下面我们分专用服务器和共享服务器分别采用这两种方式时的情况来讲
专用服务器模式
o一种方式是监听进程接收到用户进程请求后,产生一个新的专用服务器进程,并且将对用户进程的所有控制信息传给此服务器进程,也就是说新建的服务器进程继承了监听进程的信息,然后服务器进程给用户进程发一个RESEND包,通知用户进程可以开始给它发信息了,用户进程给这个新建的服务器进程发一个CONNECT包,服务器进程再以ACCEPT包回应用户进程,致此,用户进程正式与服务器进程确定连接。
我们把这种连接叫做HAND-OFF连接,也叫转换连接
专用服务器模式
o另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程,这个服务器进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给服务器进程发送一个CONNECT包,服务器进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向服务器进程发送信息了。
这种方式我们叫做重定向连接。
专用服务器模式
o另HAND-OFF连接需要系统平台具有进程继承的能力,为了使WINDOWS NT/2000支持HAND-OFF必须在HKEY_LOCAL_MACHINE>SOFTWARE>ORACLE >HOMEX中设置USE_SHARED_SOCKET 。
o案例:
o具体的应用环境描述如下:
1、有数据库主机A,在局域网内
2、局域网有代理网关服务器B操作系统
3、在外网有一台工作站C。
想实现,在B机器上对A机器上的数据库Listener端口进行
映射,将A机的数据库发布给外网。
在C机上通过sqlplus等工具,可以通过B机访问A机的数据库。
目前1521端口只是监听端口,数据端口是随机分配的。
o服务器上的监听进程在1521端口上进行侦听
o客户端发起一个数据库连接请求
o监听进程listern一个Oracle服务器进程(Server Process),也可称之为影子进程(Shadow Process )。
服务器进程选择一个大于1024的端口号进行侦听,监听进程把这个端口号发回到客户端,要求客户端重新连接这个指定的端口。
o客户端重新连接监听指定的新端口,也就是重新进行连接。
o客户端与Server Process直接对话,不再通过监听,进行会话认证(登录),执行SQL等等
o Oracle客户端连接服务器,首先去找1521监听端口,服务器的1521监听端口再向server process进程发出请求,
并返回一个随机端口,返回给客户端,客户端再来连接这个端口。
这样就给服务器上的防火墙设置带来了麻烦,
这个端口是随机的,如何开放?
o(CONNECT_DATA=(SERVICE_NAME=orcl)(CID=(PROGR AM=D:\Program?Files\Quest?Software\Toad?for?Oracle?
10.6\Toad.exe)(HOST=KTSP)(USER=Administrator))) *
(ADDRESS=(PROTOCOL=tcp)(HOST=192.18.0.105)(POR T=50691)) * establish * orcl * 0
o从上述过程可以看到,客户端最终连接的端口实际上并不是1521。
由于防火墙一般只开放了几个端口,对Oracle数据库只开放了1521端口,这样在客户端进行第二次连接时,不能通过防火墙,导致连接数据库失败
o庆幸的是,只有Windows平台上的9i及以下版本的Oracle才会有这个问题。
Oracle在Linux以及Unix平台下,多个进程间可以对端口进行复用,Oracle Server Process仍然使用的是跟监听进程一个端口(1521)。
通过在linux使用strace跟踪客户端连接数据库的过程可以发现,客户端只连接了一次,并没有进行第二次连接,与上面描述的流程相比已经发生了变化。
在Windows平台上,10g及以上版本的库,也同样利用端口复用,避免了这样的问题
o方法一:
n在windows2000的注册表中,hkey_local_machine\software\oracle\home0\下加入字符串值:
USE_SHARED_SOCKET=TRUE,即可
o方法二:
n1、首先将数据库实例改为SHARED SERVER模式
2、以SYSDBA登录SQLPLUS,通过SQLPLUS生成系统当前的参数设置文件
pfile:create pfile='d:\init.ora' from spfile;
3、修改d:\init.ora文件,在其中增加(用editplus编辑):*.service_names='your
service name'和*.dispatchers='(address=(protocol=
tcp)(host=localhost)(port=1521)(dispatchers=1)'
4、生成新的SPFILE:create spfile from pfile='d:\init.ora';
5、重启动数据库。
6、在防火墙中开放1521端口。
o方法三:
n在数据库端(也可以是另外的机器,但是cman的机器必须和数据库都在防火墙的后面)安装了cman的前提下,启动cman,然后开放防火墙端的1630端口(看cman开的是什
么端口啦),最后在客户端的tnsnames.ora文件中添加:
cmantest = (description = (address_list = (address = <-first address is to
CMAN (protocol=tcp) (host=hostname or ip of cman) (port=1610) )
(address= <-second address is to Listener (protocol=tcp) (host=hostname
or ip of listener) (port=1521) ) ) (connect_data = (sid = sidname))
(source_route = yes)
o ORA-3113错误:
n防火墙设置了TCP连接超时,如果在1小时内没有任何活动,就会被防火墙拆除
n操作系统中keep alive的相关设置,不同的系统有不同的设置方法。
比如在Linux中,在sysctl中设置net.ipv4.tcp_keepalive_time = 120,表示探测时间为120秒,即2分
钟。
在AIX中,通过no命令将tcp_keepidle参数设置为240,表示探测时间为120秒。
注意AIX中这个参数的单位是1/2秒,而在Linux中是1秒
o ORA-3113错误:
n防火墙设置了TCP连接超时,如果在1小时内没有任何活动,就会被防火墙拆除
n操作系统中keep alive的相关设置,不同的系统有不同的设置方法。
比如在Linux中,在sysctl中设置net.ipv4.tcp_keepalive_time = 120,表示探测时间为120秒,即2分
钟。
在AIX中,通过no命令将tcp_keepidle参数设置为240,表示探测时间为120秒。
注意AIX中这个参数的单位是1/2秒,而在Linux中是1秒
n不幸的是,通过在Linux和AIX上对Oracle进行跟踪发现,Oracle客户端连接数据库时(包括Oracle Server作为客户端连接DB LINK上的数据库),并没有在TCP Socket上
打开SO_KEEPALIVE,因此不能通过设置操作系统的tcp keep alive的设置来解决此问
题。
n还好Oracle提供了类似的机制。
也就是DCD(Dead Conneciton Detection)。
在$ORACLE_HOME/network/admin/sqlnet.ora文件中增加如下一行:
n EXPIRE_TIME=2 分
共享服务器模式
o只有重定向连接的方式,工作方式是监听进程接收到用户进程的请求后产生一个新的调度进程,这个调度进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给调度进程发送一个CONNECT包,调度进程再给用户进程发送一个
ACCEPT包,致此,用户进程可以正式向调度进程发送信息了。
可以通过设置MAX_DISPIATCHERS这个参数来确定调度进程的最大数目,如果调度进程的个数已经达到了最大,或者已有的调度进程不是满负荷,监听进程将不再创建新的调度进程,而是让其中一个调度进程选用一个TCP/IP端口来与此用户进程交互
共享服务器模式
o调度进程每接收一个用户进程请求都会在监听进程处作一个登记,以便监听进程能够均衡每个调度进程的负荷,所有的用户进程请求将分别在有限的调度进程中排队,所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个ORACLE的共享服务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的个数),也就是说所有的调度进程共享同一个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各个调度进程从各自的响应队列中将结果取出再返回给用户进程
共享服务器模式
o调度进程每接收一个用户进程请求都会在监听进程处作一个登记,以便监听进程能够均衡每个调度进程的负荷,所有的用户进程请求将分别在有限的调度进程中排队,所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个ORACLE的共享服务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的个数),也就是说所有的调度进程共享同一个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各个调度进程从各自的响应队列中将结果取出再返回给用户进程
ORACLE监听参数
o LISTENER 指出一个监听器定义的起始点。
它实际上是正被定义的当前监听器的名称。
默认的名称是LISTENER。
o DESCRIPTION 描述每个监听位置
o ADDRESS_LIST 含有与监听器正在监听的那些位置有关的地址信息o PROTOCOL 指定用于本监听位置的协议
o HOST 保存监听器所驻留在的那台计算机的名称
o PORT 含有监听器正在上面监听的地址
o SID_LIST_LISTENER 定义配置监听器所针对的ORACLE服务的列表
ORACLE监听参数
o GLOBAL_DBNAME 标识全局数据库名称。
本项应该与当前Oracle服务的init.ora文件中的SERVICE_NAMES项一致
o ORACLE_HOME 给出服务器上Oracle可执行程序的位置
o SID_NAME 含有用于本Oracle实例的Oracle SID的名称
o SID_LIST_LISTENER 定义配置监听器所针对的ORACLE服务的列表
ORACLE监听参数
o Lsnrctl命令用来管理Oracle监听器,是一个命令行界面。
想调用这个命令行工具,在命令行键入lsnrctl即可。
可以在LSNRCTL>提示符下键入help来显示这些命令的一份清单。
o Services 列举出服务的一个汇总表及为每个协议服务处理程序所建立和拒绝的连接信息个数
o Start listener 启动指定的监听器
o Status listener 显示指定监听器的状态
o Stop listener 关闭指定的监听器
ORACLE监听参数
o Trace 打开监听器的跟踪特性0-16
o Version 显示Oracle Net软件与协议适配器的版本
o Change_password允许用户修改关闭监听器所需要的密码
o Reload 重新读取listener.ora文件,但不关闭监听器。
如果该文件发生了变化,重新刷新监听器。
o Save_config当从lsnrctl工具中对listener.ora文件进行了修改时,复制一个叫做listener.bak的listener.ora文件
o Exit 退出lsnrctl实用工具
o Quit 执行和exit相同的功能
ORACLE监听功能
o监听客户端请求。
o监听器运行在数据库服务器之上,与Oracle实例(可为多个)相关关联,是一个专门的进程process,在windows的服务项目或者Linux的运行进程列表中,都会
看到对应的运行进程。
Windows上名为TNSLSNR,Linux/Unix平台上是lsnrctl。
监听器守候在服务器制定端口(默认为:1521),监听客户端的请求
o为客户端请求分配Server Process
o监听器只负责接听请求,之后将请求转接给Oracle Server Process。
在Oracle的服务模式下,客户端进程是不允许直接操作数据库实例和数据,而
是通过一个服务进程Server Process(也称为影子进程)作为代理。
监听器
接受到请求之后,就向操作系统(或者Dispatcher组件)要求fork(或分配)
一个Server Process与客户端相连
ORACLE监听功能
o注册实例服务
o本质上将,listener是建立实例和客户端进程之间联系的桥梁。
Listener与实例之间的联系,就是通过注册的过程来实现的。
注册的过程就是实例告诉监听
器,它的数据库数据库实例名称instance_name和服务名service_names。
监听器注册上这样的信息,对客户端请求根据监听注册信息,找到正确的服务
实例名称。
目前Oracle版本中,提供动态注册和静态注册两种方式
o错误转移failover
o Failover是RAC容错的一个重要方面功能,其功能是在数据库实例崩溃的时候,可以自动将请求转移到其他可用实例上的一种功能。
可以提供很大程度上
的可用性(Availability)功能。
这个过程中,发现实例已经崩溃,并且将请
求转移到其他实例上,就属于是listener的功能
ORACLE监听功能
o负载均衡衡量
o在RAC架构中,Oracle实现了负载均衡。
当一个客户请求到来时,Oracle会根据当前RAC集群环境中所有实例的负载情况,避开负载较高的实例,将请求
转移到负载较低的实例进行处理。
在早期RAC版本中,负载轻重的衡量是根据
监听器当前维护连接数目来确定的,而不是实时查看多实例的负载。
RAC环境
中的监听器之间进行沟通通信
ORACLE监听配置
o在命令行窗口(CMD),输入lsnrctl,就可以进入监听器控制窗口
ORACLE监听配置
ORACLE监听配置
o在命令行窗口(CMD),输入lsnrctl,就可以进入监听器控制窗口
o LSNRCTL for 32-bit Windows: Version 10.2.0.3.0 -Production on 16-4月-2011 09:2
o//Listener版本信息,在一台机器多实例的情况下,很重要!因为版本对应向下兼容
o跟踪级别off
o//调试信息,可以设置针对监听器的跟
o监听程序参数文件D:\oracle\network\admin\listener.ora o//使用的参数
o安全性ON: Local OS Authentication
o//表明启动、关闭监听器的操作权限是通过OS验证实现的。
也就意味着,可以对监听器设置密码项目,也是Oracle安全配置的一个重要方面;
ORACLE监听配置
o listener.ora。
o这个文件是一个文本类型参数文件,描述了监听器监听端口,主机名称和静态注册信息。
Listener.ora是随着数据库实例的建立之后,建立监听器的过程中动态配置
的
o监听程序日志文件D:\oracle\network\log\listener.log o操作日志位置
o监听器日志,是一个记录和描述监听器工作和错误的信息库。
通过仔细研究日志内容,可以帮助我们发现当前的监听器的问题、解决连接故障和深入理解监
听器工作原理
ORACLE监听配置
o开启/关闭监听器。
o监听器的行为受到参数文件的控制,我们有时候需要调整监听器的参数。
调整监听参数的方法,可以通过Oracle提供的GUI界面完成,还可以通过手工修改
listener.ora来完成
o关于监听器的参数配置。
使用GUI可以满足大部分的情况,而且可以避免拼写错误引发的监听器故障(监听器不会检查配置项目的正确与否)。
但是,在一些比较复杂的情况下,比如一台机器绑定多个IP的情况,或者RAC的复杂功能配置上,还是倾向于使用手工编写listener.ora的方法
ORACLE监听配置
o静态注册。
o静态注册顾名思义,就是显示的指定出监听器程序要为那个实例以哪个服务名做监听。
在启动监听器的时候,监听程序是不知道所监听实例服务是否存在。
直到有客
户端请求指定的服务
o指定静态注册的位置是在listener.ora参数文件
o添加如下
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = d:\oracle\product\10.2.0\db_1)
(SID_NAME = orcl)
)
o其中,SID_LIST配置节点中的SID_DESC就是配置静态注册的节点项目。
SID_LIST里用来配置当前监听器注册的服务项目,通过多个SID_DESC进行配置,每个SID_DESC
基本上就是一个配置项目。
默认是动态注册的时候,只有PLSExtProc项目
ORACLE监听配置
o动态注册。
o动态注册的动作是监听器所在主机上数据库实例完成。
动态注册是Oracle上一个不能关闭的功能。
实例的background process PMON,每隔一段时间(一
到两分钟)就会将实例的参数信息注册到监听器上,实现动态注册
o注册的信息是数据库参数service_name和instance_name。
可以通过Show Parameter命令查看
ORACLE监听配置
o实例注册问题。
o如果instance_name参数没有设置,则系统会选取参数db_name作为实例名称返回。
如果service_names没有设置,则会将db_name和db_domain两个参数组
合成服务名实现注册
o值得注意的一个问题是,service_names参数是一个可以指定多个服务名称的参数,以逗号分隔。
也就是说,一个Oracle实例时可以同时作为多个服务名
向外提供服务的。
Service_name是Oracle在新近版本中提出,替代
SID_NAME的概念。
使用Service的指定方式,多个Oracle实例就可以统一提
供一致的数据访问服务(也就是RAC)
ORACLE监听配置
o实例注册问题。
o通常,对instance_name和service_name两个参数,还是建议设置上。
因为会在一定程度上影响到动态注册的效果
o如果没有显示的指定这两个参数,那么只有在数据库实例启动在监听器实例之后的时候,才会一次动态注册。
一旦之后监听器重新启动,动态注册的信息就
不会存在,而且很难再次注册上。
所以,我们是推荐将这两个参数设置上的o只有显示设置两个值的情况下,PMON才会周期性的将注册信息加以注册。
通过命令行,也可以强迫PMON立即执行一次注册操作
o alter system register
o System altered
ORACLE监听配置
o动态注册问题。
o最后,我们聊一聊动态注册的作用,支持错误转移failover。
注册操作的发动方是PMON后台进程,PMON是Oracle实例最重要的后台进程,很多资料和
DBA都是以该进程的状态确定数据库实例的状态。
PMON负责动态注册,如果
不能进行动态注册,说明PMON已经失去了工作能力,也就意味着监听程序所
服务的实例已经不能工作
o通过动态注册的机制,监听程序是可以知道所服务的服务器实例已经崩溃,对于客户端的请求,可以实现错误转移
o我们这里谈到的崩溃是实例的崩溃。
如果监听器程序崩溃了,情况又是另一种样子了
ORACLE几个比较容易混混淆的概念
o Db_name 。
o对一个数据库(Oracle database)的唯一标识。
这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库
的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造
成管理上的混乱。
为了解决这种情况,引入了Db_domain参数,这样在数据
库的标识是由Db_name和Db_domain两个参数共同决定的,避免了因为数
据库重名而造成管理上的混乱。
这类似于互连网上的机器名的管理。
我们将
Db_name和Db_domain两个参数用’.’连接起来,表示一个数据库,并将该
数据库的名称称为Global_name,即它扩展了Db_name。
Db_name参数只
能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。
查看方式:show
parameter db_name;
ORACLE几个比较容易混混淆的概念
o Global_name:
o对一个数据库(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’。
查看方式:show
parameter global_name;
o Db_domain:
o定义一个数据库所在的域,域只是为了更好的管理分布式oracle系统。
查看方式:show parameter db_domain;
ORACLE几个比较容易混混淆的概念
o Service_name :
o该参数是oracle8i新引进的。
在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多
个网络服务名,设置繁琐。
为了方便并行环境中的设置,引进了
Service_name参数,该参数对应一个数据库,而不是一个实例,而且该参数
有许多其它的好处。
该参数的缺省值为Db_name. Db_domain,即等于
Global_name。
一个数据库可以对应多个Service_name,以便实现更灵活
的配置。
该参数与SID没有直接关系,即不必Service name 必须与SID一样。
查看方式:show parameter service_name;
o Net service name :
o网络服务名,又可以称为数据库别名(database alias)。
是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。
查看方式:show parameter Net service name;
ORACLE网络构架
o Oracle的网络结构,往复杂处说能加上加密、LDAP等等。
这里不做讨论,重点放在基本的网络结构也就是我们最常用的这种情况
三个配置文件:listener.ora、sqlnet.ora、tnsnames.ora ,都是放在
$ORACLE_HOME\network\admin目录下。
重点:三个文件的作用和使用
ORACLE网络构架
o sqlnet.ora文件:
o作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串,
例如我们客户端输入
sqlplus sys/oracle@orcl
假如我的sqlnet.ora是下面这个样子
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例,当然我这里orcl并不是一个主机名
ORACLE网络构架
o sqlnet.ora文件:
o如果我是这个样子
NAMES.DIRECTORY_PATH= (TNSNAMES)
那么客户端就只会从tnsnames.ora查找orcl的记录
括号中还有其他选项,如LDAP等并不常用
ORACLE网络构架
o Tnsnames.ora
o这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似
NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。
例子中有两个,ORCL 对应的本机,SALES对应的另外一个IP地址,里边还定义了使用主用服务器还是共享服务器模式进行连接,一句一句说
#你所要连接的时候输入得TNSNAME
ORCL =(DESCRIPTION =(ADDRESS_LIST =
#下面是这个TNSNAME对应的主机,端口,协议
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)(CONNECT_DATA =
ORACLE网络构架
o Tnsnames.ora
o#使用专用服务器模式去连接需要跟服务器的模式匹配,如果没有就根据服务器的模式
#自动调节
(SERVER = DEDICATED)
#对应service_name,SQLPLUS>show parameter service_name;
#进行查看(SERVICE_NAME = orcl)
#下面这个类似
hospnew =(DESCRIPTION =(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =
192.168.188.219)(PORT = 1521)))
(CONNECT_DATA =(SERVER = DEDICATED)
(SERVICE_NAME = orcl)))
ORACLE网络构架
o listener.ora (listener监听器进程的配置文件)
o关于listener进程,接受远程对数据库的接入申请并转交给oracle的服务器进程。
所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并
不会影响已经存在的数据库连接。
o监听器的名字,一台数据库可以有不止一个监听器
上面说到的三个文件都可以通过图形的配置工具来完成配置
$ORACLE_HOME/netca 向导形式的
$ORACLE_HOME/netmgr
ORACLE网络构架
o总体结构流程
o是当你输入sqlplus sys/oracle@hospnew的时候
1. 查询sqlnet.ora看看名称的解析方式,发现是TNSNAME
2. 则查询tnsnames.ora文件,从里边找orcl的记录,并且找到主机名,
端口和service_name
3. 如果listener进程没有问题的话,建立与listener进程的连接。
4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,
listener采取接下去的动作。
默认是专用服务器模式,没有问题的话客户端就
连接上了数据库的server process。
5. 这时候网络连接已经建立,listener进程的历史使命也就完成了
ORACLE网络构架
o几种连接用到的命令形式
1.sqlplus / as sysdba 这是典型的操作系统认证,不需要listener
进程
2.sqlplus sys/oracle 这种连接方式只能连接本机数据库,同样不需
要listener进程
3.sqlplus sys/oracle@orcl 这种方式需要listener进程处于可用状
态。
最普遍的通过网络连接。
以上连接方式使用sys用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态,操作系统认证也不需要数据库可用,普通用户因为是数据库认证,所以数据库必需处于open状态
ORACLE网络构架
o使用hostname访问数据库而不是tnsname的例子
o使用tnsname访问数据库是默认的方式,但是也带来点问题,那就是客户端都是需要配置tnsnames.ora文件的。
如果你的数据库服务器地址发生改变,就需要重新编辑客户端这个文件。
通过hostname访问数据库就没有了这个麻烦。
需要修改
服务器端listener.ora
#监听器的配置文件listener.ora
#使用host naming则不再需要tnsname.ora文件做本地解析
ORACLE网络构架
o# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
# (SID_NAME = PLSExtProc)
(SID_NAME = orcl)
(GLOBAL_DBNAME = server)
(ORACLE_HOME = d:\oracle\product\10.1.0\db_1)
# (PROGRAM = extproc)
))
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)
(HOST = server)(PORT = 1521))
))
ORACLE网络构架
o客户端sqlnet.ora 如果确认不会使用TNSNAME访问的话,可以去掉TNSNAMES # sqlnet.ora Network Configuration File:
d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (HOSTNAME)
Tnsnames.ora文件不需要配置,删除也无所谓。
下面就是网络和操作系统的配置问题了,怎么样能够解析我的主机名的问题了
可以通过下面的方式连接
sqlplus sys/oracle@server
这样的话,会连接server这台服务器,并且listener来确定你所要连接的service_name
ORACLE精简版构造
o客户端所需DLL
oci.dll,ocijdbc10.dll ociw32.dll orannzsbb10.dll oraocci10.dll oraociei10
.dll sqlnet.ora tnsnames.ora classes12.jar ojdbc14.jar
p配置tnsname
p添加一个环境变量,名为TNS_ADMIN,值为tnsnames.ora文件所在路径(如:D:\oraclient,特别是重装后或其它操作,忘了TNS_ADMIN变量,plsql登陆就会报无法解析指定的连接标识符),这是为了能够找到上面说的tnsnames.ora。
如果本机上安装了ORACLE ,并且设置了ORACLE_HOME环境变量,那么会自动在
%ORACLE_HOME%/network/admin/位置查找tnsnames.ora文件。
o设置ORACLE的语言,添加环境变量:“NLS_LANG =
SIMPLIFIEDCHINESE_CHINA.ZHS16GBK”,(AMERICAN_7ASCII 是ASCII编码类型,其它类型可自己到服务器看一下或网上查找一下)。