ORACLE 关于监听listener所有知识点涵盖文档.docx
《ORACLE 关于监听listener所有知识点涵盖文档.docx》由会员分享,可在线阅读,更多相关《ORACLE 关于监听listener所有知识点涵盖文档.docx(13页珍藏版)》请在冰豆网上搜索。
ORACLE关于监听listener所有知识点涵盖文档
三个文件、位置$ORACLE_HOME/network/adminsqlnet.oratnsnames.oralistener.ora
监听类型:
静态注册、动态注册
监听器里的服务的状态
ready:
此状态的服务是由PMON进程注册的,由于PMON进程所在的实例是打开的,这些服务名所对应的
实例已经准备(ready)好接受用户的连接请求了。
unknown:
此状态的服务时静态注册的,监听器并不确定该服务名所对应的实例名是否已经打开,所以
状态时未知的。
异机监听:
利用remote_listener参数,使数据库服务与监听服务分离。
条件:
远程服务器(即监听所在服务器)安装数据库软件,监听进程正常状态。
服务器说明:
远程服务器为:
192.168.10.12
数据库服务器:
192.168.10.15
步骤:
(1)配置数据库服务器中tnsnames.ora文件、remote_listener参数
tnsnames.ora
remote12=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.12)(PORT=1521))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
altersystemsetremote_listener='remote12'scope=spfile/memory/both;
altersystemregister;
(2)查看远程服务器中对应端口监听状态,并配置tnsnames.ora文件
lsnrctlstatus
tnsnames.ora
remote15=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.12)(PORT=1521))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
(3)测试是否正确监听
sqlplusxxx/xxx@remote15
文件作用:
sqlnet.ora-----作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串,
例如我们客户端输入
sqlplussys/oracle@orcl
假如我的sqlnet.ora是下面这个样子
SQLNET.AUTHENTICATION_SERVICES=(NTS)
NAMES.DIRECTORY_PATH=(TNSNAMES,HOSTNAME)
那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例,当然我这里orcl并不是一个主机名
如果我是这个样子
NAMES.DIRECTORY_PATH=(TNSNAMES)
那么客户端就只会从tnsnames.ora查找orcl的记录
括号中还有其他选项,如LDAP等并不常用。
tnsnames.ora-----作用用来提供服务名通过服务名确定连接的数据库服务器,端口。
动态注册也用到服务名。
listener.ora------作用用来配置监听。
静态监听在此进行配置。
一个listener配置对应一个监听进程。
参数作用:
local_listener-------作用用来确定动态注册服务名。
空值则默认为listener。
相关命令介绍:
lsnrctlstart/status/stop
相关数据库命令介绍:
altersystemsetlocal_listener='注册的服务名'scope=memory/spfile/both;
altersystemregister;----手工注册
altersystemsetlocal_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1522))';
相关配置文件解读:
listener.ora
SID_LIST_LISTENER4=------------配置静态监听SID_LIST_对应的监听名称
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=orcl)------------------------配置全局数据库名可用showparameterservice_name获得
(SID_NAME=orcl)------------------------配置SID可用selectinstance_namefromv$instance;获得
(ORACLE_HOME=/u01/oracle/product/10.2.0/db_1)-------------------$ORACLE_HOME
#(PROGRAM=extproc)
)
)
LISTENER1=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1522))
)
)
LISTENER2=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1523))
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))---------------------此处用来分辨监听配置信息如不添加所有配置信息默认为同一监听
)
)
LISTENER3=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1524))
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1))
)
)
LISTENER4=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1525))
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC2))
)
)
sqlnet.ora
#sqlnet.oraNetworkConfigurationFile:
/u01/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
#GeneratedbyOracleconfigurationtools.
NAMES.DIRECTORY_PATH=(TNSNAMES,EZCONNECT)
tnsnames.ora
ORCL10G=-------集中所有服务信息用来确保所有服务名即所有监听进程(除静态注册外)都被PMON进程动态自动注册。
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1522))
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1523))
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1524))
)
ORCL=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1521))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
ORCL1=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1522))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
ORCL2=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1523))
(CONNECT_DATA=
(SERVER=DEDICATED)-----------------------独占一个服务端进程shared共享服务端进程
(SERVICE_NAME=orcl)
)
)
ORCL3=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.15)(PORT=1524))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
客户端连接方式:
专用连接
共享服务器连接
1.专用连接:
默认的连接方式,一个用户进程对应一个服务器进程
用户进程退出,服务器进程也退出,释放所有的资源
2.共享服务器模式:
用户进程与服务器进程是多对多的关系,多个服务器进程会处理多个用户进程
专用连接中,用户进程没有发出命令,服务器进程处于空闲状态,资源一直占用,共享模式中,
只要是服务器进程空闲,就可以处理其他用户发出的命令,因此服务器进程的数量减少,对资源的
利用更加高效,占用的PGA减少,可以支持更多的用户
共享连接的工作过程
共享连接模式下,需要配置多个名为dispatcher的组件,dispatcher作为用户进程和服务器进程之间的
协调者,负责将用户进程的请求传递给服务器进程,并将服务器进程得到结果返回给用户PMON定期
将每个dispatcher的地址、以及工作负载注册到监听器里面,当用户进程连接监听器时,监听器会选择
一个负载最低的dispatcher,并把该dispatcher的地址返回给用户进程,用户进程和dispatcher进程建立
连接,用户进程在session的整个生命期间,所连接的dispatcher不会发生改变
共享连接的具体步骤如下:
1、用户进程连接到监听器
2、监听器根据注册的各个dispatcher的负载情况,选择一个负载最低的dispatcher,并将其地址返回给用户进程
3、用户进程根据监听器返回的dispatcher地址,连接到该dispatcher
4、dispatcher接收到用户进程发出的请求以后,会将该请求放入请求队列,该队列位于SGA中,请求队列被所有的dispatcher共有
5、在服务器进程中,最空闲的服务器进程会从请求队列中按照先进先出的原则,挑选一个请求进行处理
6、服务器进程处理请求后,得到的结果放入响应队列,Oracle为每个dispatcher分配一个对应的响应队列
7、dispatcher到相应的队列中取出结果,返回给用户进程
注意:
1、专用连接中,用户进程和服务器进程一一对应,用户进程对应的PGA被服务器进程独享
2、共享连接中,多个服务器进程会处理多个用户请求,用户的PGA就需要在不同的服务器
进程之间共享,PGA中的UGA部分就会被放入到SGA中,如果配置了largepool,则UGA会
在largepool里分配,没有配置largepool,那么UGA就放在sharedpool里面
配置共享连接
配置共享连接时,包含以下几个方面:
1、配置dispatcher进程的数量
showparameterdispatcher
NAMETYPEVALUE
-----------------------------------------------------------------------------
dispatchersstring(PROTOCOL=TCP)(SERVICE=orclXD
B)
altersystemsetdispatchers='(PROTOCOL=TCP)(dispatchers=3)';
表示启动三个dispatcher,以tcp协议进行连接。
可以通过max_dispatchers参数定义数据库里最多
可以同时启动多少个dispatchers,如;
altersystemsetmax_dispatchers=5;
服务器进程
通过设置shared_servers来配置服务器进程,如:
altersystemsetshared_servers=5;
服务器进程可以根据需要动态生成。
如果将shared_servers设置为0,则服务器进程一旦使用完毕就会被删除。
我们应该建立较少的服务器进程,如果不够用的话,则让系统根据负载自动创建额外的服务器进程。
能够自动
同时创建的服务器进程个数有参数max_shared_servers决定。
如:
altersystemsetmax_shared_servers=20;
这时数据库默认会有5个服务器进程运行,当数据库负载增加,需要额外的服务器进程时,则会自动创建服务器
进程,最多有20个服务器进程。
而当数据库负载下降时,也会自动删除服务器进程,直到剩下5个服务器进程。
共享连接的session个数
参数shared_server_sessions说明同时可以进行共享连接的session的个数。
能够同时使用专用连接的session个数等于参数sessions减去shared_server_sessions的值。
altersystemsetshared_server_sessions=5;
在服务器端配置了共享连接以后,还需要在客户端的tnsnames.ora文件里指明,要采用共享连接方式进行连接,如:
uplooking=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.20)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=orcl)
(SERVER=shared)--------如果是专用的话是:
SERVER=DEDICATED
)
)
当我们以uplooking作为客户端的连接字符串连接到数据库以后,可以用如下方式显示服务名的详细信息,从而验证是否成功建立共享连接;
lsnrctlservice
Service"orcl.uplooking"has1instance(s).
Instance"orcl",statusREADY,has4handler(s)forthisservice...
Handler(s):
"D002"established:
0refused:
0current:
0max:
1022state:
ready
DISPATCHERuplooking,pid:
14820>
(ADDRESS=(PROTOCOL=tcp)(HOST=uplooking)(PORT=9980))
"D001"established:
0refused:
0current:
0max:
1022state:
ready
DISPATCHERuplooking,pid:
14818>
(ADDRESS=(PROTOCOL=tcp)(HOST=uplooking)(PORT=8050))
"D000"established:
1refused:
0current:
1max:
1022state:
ready
DISPATCHERuplooking,pid:
14756>
(ADDRESS=(PROTOCOL=tcp)(HOST=uplooking)(PORT=3664))
"DEDICATED"established:
0refused:
0state:
ready
LOCALSERVER
可以看到,名为D001的dispatcher建立了一个连接(established:
0)该dispatcher在8050号端口与用户进程进行连接。
共享连接的限制
有些操作不能在共享连接下完成。
启动关闭数据库实例
创建表空间和数据文件
维护表和索引等数据库管理的工作。
共享连接适用于单纯的OLTP应用。
对于需要扫描大量数据,运行时间较长的操作,不适合采用共享连接,例如备份恢复
相关示意图:
网络连接示意图
监听注册示意图