一、专用和共享服务器进程简介
Oracle数据库使用多个进程,以便多个用户和应用程序可以同时连接到单个数据库实例。Oracle数据库创建服务器进程来处理用户进程想要连接到实例的请求。
服务器进程可以是以下两者之一:
- 专用服务器进程,它只服务于一个用户进程
- 共享服务器进程,它可以服务于多个用户进程
您的数据库总是启用以允许专用服务器进程,但是您必须通过设置一个或多个初始化参数来专门配置和启用共享服务器。
1.专用服务器进程
专用服务器进程原理如下图所示。在这个图中,两个用户进程通过专用的服务器进程连接到数据库。
通常,最好是通过调度程序并使用共享服务器进程进行连接。共享服务器进程可能更加高效,因为它将运行实例所需的进程数量保持在较低水平。
但是,在以下情况下,用户和管理员应该明确地使用专用服务器进程连接到实例:
- 提交批处理作业(例如,对于服务器进程当作业允许很少或没有空闲时间时)
- 使用恢复管理器(RMAN)备份、还原或恢复数据库
当Oracle数据库配置为共享服务器时,要请求专用服务器连接,用户必须使用配置为使用专用服务器的网络服务名进行连接。具体来说,网络服务名值应该在连接描述符中包含SERVER=DEDICATED子句。
2.共享服务器进程
考虑一个具有专用服务器进程的订单输入系统。客户给订单台打电话并下订单,接电话的职员将订单输入数据库。在大多数交易中,职员都是通过电话与顾客交谈。在此期间不需要一个服务器进程,如此专用于职员的用户进程的服务器进程将保持空闲。由于空闲的服务器进程持有系统资源,系统对于其他职员输入订单的速度会比较慢。
共享服务器体系结构消除了对每个连接使用专用服务器进程的需求:
在共享服务器配置中,客户端用户进程连接到调度程序。调度程序可以同时支持多个客户端连接。每个客户端连接都绑定到一个虚拟电路,这是调度程序用于客户端数据库连接请求和应答的一块共享内存。当请求到达时,调度程序在公共队列上放置一个虚拟电路。
空闲的共享服务器进程从公共队列中获取虚拟电路,为请求提供服务,并在尝试从公共队列中检索另一个虚拟电路之前放弃虚拟电路。与专用服务器模型相比,共享服务器体系结构的一个显著优势是减少了系统资源的使用,支持更多的用户。
为了更好的资源管理,共享服务器可以配置为会话多路复用,在一个网络连接上组合多个会话进行传输,以节省操作系统的资源。
共享服务器架构需要Oracle Net Services。针对共享服务器的用户进程必须通过Oracle Net Services连接,即使它们与Oracle数据库实例在同一个系统上。
二、数据库常驻连接池简介
数据库常驻连接池(DRCP,Database Resident Connection Pooling )在数据库服务器中为典型的Web应用程序使用场景提供了连接池,应用程序从中获取数据库连接,在其上工作相对较短的时间,然后释放它。一个池服务器相当于一个服务器前台进程和一个数据库会话的组合。
DRCP补充了中间层连接池,后者共享中间层进程中线程之间的连接。此外,DRCP支持在同一中间层主机上的中间层进程之间甚至中间层主机之间共享数据库连接。这将显著减少支持大量客户端连接所需的关键数据库资源,从而减少数据库层内存占用并提高中间层和数据库层的可伸缩性。拥有一个可用的服务器池还有一个额外的好处,那就是减少创建和拆除客户端连接的成本。
DRCP特别适用于具有多进程单线程应用程序服务器(如PHP/Apache)的体系结构,这些应用程序服务器不能执行中间层连接池。该数据库仍然可以通过DRCP扩展到数以万计的同时连接。
注意:
- 从Oracle Database 12c Release 2(12.2)开始,属于同一个用户的代理会话可以被共享。
- 在Windows平台上,DRCP不支持将SQLNET.AUTHENTICATION_SERVICES参数值设置为nts。
何时使用数据库常驻连接池?
代理常驻连接池在多个客户端访问数据库时非常有用,并且适用于以下任何情况:
- 需要以最小的内存使用量支持大量客户端连接。
- 客户端应用程序是类似的,可以共享或重用会话。
- 如果应用程序用相同的数据库认证连接并使用相同的模式,那么它们是相似的。
- 客户端应用程序获得一个数据库连接,在其上工作相对较短的时间,然后释放它。
- 客户端请求之间不需要会话关联。
- 客户端有多个进程和多个主机。
数据库常驻连接池的优点:
- 支持在多个中间层客户端应用程序之间共享资源。
- 通过减少资源使用,提高数据库和应用程序的可伸缩性。
数据库常驻连接池和登录/注销触发器:
LOGON触发器在每次身份验证以及在DRCP中创建新会话时都会触发。
LOGOFF触发器在每次注销时以及在DRCP中会话被销毁时触发。因此,当会话由于空闲时间限制而终止时,会触发LOGOFF触发器。
1.DRCP与专用服务器和共享服务器的比较
专用服务器、共享服务器和数据库常驻连接池之间的区别如下所示:
Dedicated Server | Shared Server | Database Resident Connection Pooling |
---|---|---|
当接收到客户端请求时,将为客户端创建一个新的服务器进程和会话。 | 当从客户端接收到第一个请求时,Dispatcher进程将此请求放在公共队列中。该请求由可用的共享服务器进程拾取。Dispatcher进程然后管理客户机和共享服务器进程之间的通信。 | 当从客户端接收到第一个请求时,连接代理选择一个可用的池服务器,并将客户端连接传递移交给池服务器。如果没有可用的池服务器,连接代理将创建一个。如果池已达到其最大大小,则将客户端请求放在等待队列中,直到任一个池服务器可用为止。 |
释放数据库资源涉及到终止会话和服务器进程。 | 释放数据库资源涉及到终止会话。 | 释放数据库资源涉及将池服务器释放到池中。 |
内存需求与服务器进程和会话的数量成正比。每个客户机有一个服务器进程和一个会话。 | 内存需求与共享服务器进程和会话的总和成正比。每个客户机有一个会话。 | 内存需求与池服务器及其会话的数量成正比。每个池服务器都有一个会话。 |
会话内存从PGA中分配。 | 会话内存从SGA中分配。 | 会话内存从PGA中分配。 |
专用服务器、共享服务器和数据库常驻连接池的内存使用示例:
考虑这样一个应用程序,其中每个会话所需的内存为400 KB,每个服务器进程所需的内存为4 MB。池大小为100,使用的共享服务器数量为100。
如果有5000个客户端连接,每个配置所占用的内存如下:
-
专用服务器
内存使用量= 5000 X (400 KB + 4 MB) = 22 GB -
共享服务器
内存使用量=5000 X 400 KB + 100 X 4 MB = 2.5 GB
在2.5 GB中,2GB从SGA分配。 -
数据库常驻连接池
内存使用量=100 X (400 KB + 4 MB) + (5000 X 35KB)= 615 MB
到代理的每个连接的成本大约为35 KB。
三、代理常驻连接池简介
代理常驻连接池可以在流量主管模式(Traffic Director Mode)下使用Oracle连接管理器(Oracle Connection Manager)进行配置。代理常驻连接池为数据库客户端提供了高可用性、高安全性和高性能。
基于下列任何一种技术的数据库客户端都可以使用代理常驻连接池连接到数据库实例——Oracle Call Interface (OCI), Java Database Connectivity (JDBC), Oracle Data Provider for .NET (ODP.Net), Open Database Connectivity (ODBC), ProC, ProCOBOL, PHP OCI8 extension, Node.js node-oracledb driver, Python cx_Oracle, ROracle, Ruby-oci8, Perl DBD::Oracle, or Oracle C++ Call Interface (OCCI)。
注意:从Oracle Database 18c开始,可以使用代理常驻连接池。
何时使用代理常驻连接池?
代理常驻连接池在多个客户端访问数据库时非常有用,并且适用于以下任何情况:
- 需要使用较少的连接来支持大量的客户端连接数据库。
- 数据库连接需要在中间层连接池之间共享。
- 超过64K会话需要得到支持(当共享服务器由于会话限制为 64K 而无法使用时)。
- 对于不支持透明应用程序故障转移(TAF,Transparent Application Failover)和Oracle - RAC的旧客户端,或者不使用Oracle数据库常驻连接池(DRCP)、快速应用程序通知(FAN,Fast Application Notification)或应用程序连续性(AC, Application Continuity)的客户端,需要支持高可用性。
代理常驻连接池的优点:
- 改进的高可用性(计划中的和计划外的)
- 改进的数据库安全性
- 数据库连接多路复用
四、为共享服务器配置Oracle数据库
您可以启用共享服务器,设置或更改共享服务器初始化参数。
1.关于共享服务器的初始化参数
SHARED_SERVERS:指定要启动的共享服务器的初始数量和要保留的共享服务器的最小数量。这是使用共享服务器唯一需要的参数。
-
MAX_SHARED_SERVERS:指定可以同时运行的共享服务器的最大数目。
-
SHARED_SERVER_SESSIONS:指定可以同时运行的共享服务器用户会话的总数。通过设置该参数,可以为专用服务器预留用户会话。
-
DISPATCHERS:在共享服务器架构中配置调度程序进程。
-
MAX_DISPATCHERS:指定可以同时运行的调度程序进程的最大数目。
这个参数现在可以忽略。只有在将来的版本中,当调度程序的数量根据并发连接数自动调整时,它才有用。 -
CIRCUITS:指定可用于入站和出站网络会话的虚拟电路总数。
2.关于共享服务器的内存管理
共享服务器在共享池或大型池中需要一些用户全局区域 (UGA)。对于具有少量并发会话的安装,这些系统全局区域(SGA)组件的默认大小通常就足够了。但是,如果您希望在安装中使用大量会话,则可能必须调整内存以支持共享服务器。
3.启用共享服务器
通过ALTER SYSTEM 语句将SHARED_SERVERS初始化参数设置为大于0的值,可以启用共享服务器。其他共享服务器初始化参数无需设置。
因为共享服务器至少需要一个调度器才能工作,所以即使没有配置调度器,也会启动一个调度器。
注意:
- 如果在数据库启动时初始化参数文件中没有包含SHARED_SERVERS,但包含DISPATCHERS,并且它指定至少一个调度程序,则启用共享服务器。在本例中,SHARED_SERVERS的默认值是1。
- 如果初始化文件中既不包括SHARED_SERVERS也不包括DISPATCHERS,则在实例启动后仅通过更改DISPATCHERS参数不能启动共享服务器。必须将SHARED_SERVERS修改为非零值才能启动共享服务器。
说明:
如果您使用数据库配置助手(DBCA)创建Oracle数据库,DBCA为Oracle XML DB (XDB)配置一个调度程序。这是因为XDB协议像HTTP和FTP一样需要共享服务器。这导致SHARED_SERVER值为1。尽管启用了共享服务器,但此配置只允许连接到XDB服务的会话使用共享服务器。要为常规数据库会话(用于提交SQL语句)启用共享服务器,必须添加额外的调度程序配置,或者用不特定于XDB的配置替换现有配置。
(1)关于为shared_servers确定一个值
SHARED_SERVERS初始化参数指定在启动实例时希望创建的共享服务器的最小数量。在实例启动后,Oracle数据库可以根据现有的共享服务器的繁忙程度和请求队列的长度动态调整共享服务器的数量。
在典型的系统中,共享服务器的数量稳定在每10个连接对应一个共享服务器的比例。对于OLTP应用程序,当请求率较低,或者服务器使用与请求的比率较低时,连接与服务器的比率可能较高。相反,在请求率高或服务器使用与请求的比例较高的应用程序中,连接与服务器的比率可能较低。
PMON(进程监视器)后台进程不能终止共享服务器至SHARED_SERVERS指定的值以下。因此,您可以使用该参数来稳定负载,并通过防止PMON由于负载的巧合波动而终止然后重新启动共享服务器,从而最小化对系统的压力。
如果知道系统上的平均负载,可以将SHARED_SERVERS设置为最佳值。下面的例子展示了如何使用该参数:
假设一个电话营销中心正在使用一个数据库,该中心有1000名代理人。平均而言,每个代理人花费90%的时间与客户交谈,只有10%的时间查找和更新记录。为了防止共享服务器在代理人与客户交谈时终止,然后在代理访问数据库时再次生成,DBA指定共享服务器的最佳数量为100。
然而,并不是所有轮班的工作人员数量都在同一级别。夜班只需要200名代理人。由于SHARED_SERVERS是一个动态参数,DBA在晚上将共享服务器的数量减少到20,这样就可以为批处理作业等其他任务释放资源。
(2)减少共享服务器进程的数量
通过动态地将SHARED_SERVERS参数设置为较低的值,可以减少必须保持活动的共享服务器的最小数量。此后,直到共享服务器的数量减少到SHARED_SERVERS参数的值为止,PMON将标记任何变为非活动的共享服务器,以便终止。
# 通过使用ALTER SYSTEM语句将SHARED_SERVERS初始化参数设置为非零值来动态设置共享服务器。 ALTER SYSTEM SET SHARED_SERVERS = 5;
复制
(3)限制共享服务器进程的数量
MAX_SHARED_SERVERS初始化参数指定PMON可以自动创建的共享服务器的最大数量。它没有默认值。
如果没有指定值,那么PMON依据负载启动所需要的共享服务器的数量,受以下限制:
- 进程限制(由PROCESSES初始化参数设置)
- 空闲进程插槽的最小数目(至少是总进程插槽的八分之一,如果PROCESSES设置为小于24则为两个插槽)
- 系统资源
限制共享服务器进程的数量:
- 设置MAX_SHARED_SERVERS初始化参数。
SHARED_SERVERS的值将无视MAX_SHARED_SERVERS的值。因此,通过将SHARED_SERVERS设置为高于MAX_SHARED_SERVERS的值,可以强制PMON启动比MAX_SHARED_SERVERS值更多的共享服务器。随后,您可以通过动态地将MAX_SHARED_SERVERS更改为一个高于SHARED_SERVERS的值,从而为共享服务器的数量设置一个新的上限。
限制共享服务器数量的主要原因是为其他进程预留资源,例如内存和CPU时间。例如,考虑前面讨论的电话营销中心的情况:
DBA希望为夜间的批处理作业保留三分之二的资源。他将MAX_SHARED_SERVERS设置为小于最大进程数(processes)的三分之一。通过这样做,DBA可以确保即使所有代理恰好同时访问数据库,批处理作业也可以连接到专用服务器,而不必等待共享服务器在处理代理请求后关闭。
限制共享服务器数量的另一个原因是为了防止过多的服务器进程的并发运行,由于频繁的交换而降低系统的速度,尽管processes可以作为上限,而不是MAX_SHARED_SERVERS。
限制共享服务器数量的其他原因是测试、调试、性能分析和调优。例如,要查看需要多少个共享服务器才能有效地支持某个用户社区,可以将MAX_SHARED_SERVERS从一个非常小的数字向上更改,直到用户注意到响应时间无延迟为止。
(4)限制共享服务器会话的数量
SHARED_SERVER_SESSIONS初始化参数指定并发共享服务器用户会话的最大数量。
通过设置这个动态参数,可以为专用服务器预留数据库会话。这进而确保需要专用服务器的管理任务(如备份或恢复数据库)不会被共享服务器会话抢占。
限制共享服务器会话的数量:
- 设置SHARED_SERVER_SESSIONS初始化参数。
该参数没有默认值。如果不指定该参数,系统可以根据需要创建共享服务器会话,但受sessions初始化参数的限制。
(5)保护共享内存
CIRCUITS初始化参数设置可在共享内存中创建的虚拟电路数量的最大限制。该参数没有默认值。如果不指定,则系统可以根据需要创建电路,但受DISPATCHERS初始化参数和系统资源的限制。
通过限制可在共享内存中创建的虚拟电路的数量来保护共享内存:
- 设置CIRCUITS初始化参数。
4.配置调度程序
DISPATCHERS初始化参数在共享服务器体系结构中配置调度程序进程。共享服务器要工作,至少需要一个调度程序进程。如果不指定调度程序,但是通过将SHARED_SERVER设置为非零值来启用共享服务器,那么默认情况下Oracle数据库会为TCP协议创建一个调度程序。
此配置的初始化参数的等效DISPATCHERS显式设置为:
dispatchers="(PROTOCOL=tcp)"
复制
如果满足以下任一条件,可以使用dispatchers初始化参数配置更多调度程序:
必须配置TCP/IP以外的协议。使用DISPATCHERS参数的下列属性之一配置协议地址:
- ADDRESS
- DESCRIPTION
- PROTOCOL
你想配置一个或多个可选的调度程序属性:
- DISPATCHERS
- CONNECTIONS
- SESSIONS
- LISTENER
- MULTIPLEX
- SERVICE
(1)DISPATCHERS初始化参数属性
协议地址是必需的,并使用以下一个或多个属性指定:
Attribute | Description |
---|---|
ADDRESS | 指定调度程序侦听的端点的网络协议地址。 |
DESCRIPTION | 指定调度程序侦听的端点的网络描述,包括网络协议地址。语法如下:(DESCRIPTION=(ADDRESS=...)) |
PROTOCOL | 指定调度程序为其生成侦听端点的网络协议。例如:(PROTOCOL=tcp) |
下面的属性指定这个配置应该有多少个调度程序。它是可选的,默认为1。
DISPATCHERS | 指定要启动的调度程序的初始数量。 |
---|
下面的属性告诉实例这个配置的每个调度程序的网络属性。它们都是可选的。
CONNECTIONS | 指定每个调度程序允许使用的最大网络连接数。 |
---|---|
SESSIONS | 指定每个调度程序允许使用的最大网络会话数。 |
LISTENER | 为 LREG 进程注册的调度程序信息的侦听器指定别名。将别名设置为通过命名方法解析的名称。 |
MULTIPLEX | 用于启用Oracle连接管理器会话多路复用特性。 |
SERVICE | 指定调度程序向侦听器注册的服务名称。 |
可以指定整个属性名,也可以指定至少由前三个字符组成的子字符串。例如,您可以指定SESSIONS=3、SES=3、SESS=3或SESSI=3,等等。
(2)确定Dispatchers的数量
一旦您知道了操作系统中每个进程的可能连接数量,就可以计算在实例启动期间为每个网络协议创建的调度程序初始数量。
要计算在实例启动期间要创建的调动程序的初始数量,请使用以下公式:
Number of dispatchers = CEIL ( max. concurrent sessions / connections for each dispatcher )
复制
CEIL返回四舍五入到下一个整数的结果。
例如,假设一个系统的每个进程可以支持970个连接,并且有:
- TCP/IP协议最多可同时连接4000个会话
- 具有SSL的TCP/IP并发会话数不超过2500个
TCP/IP的DISPATCHERS属性至少应该设置5个调度程序(4000 / 970),对于具有SSL的TCP/IP应该设置3个调度程序(2500 / 970:
DISPATCHERS='(PROT=tcp)(DISP=5)', '(PROT=tcps)(DISP=3)'
复制
根据性能,您可能需要调整调度程序的数量。
(3)设置调度程序的初始数量
通过将DISPATCHERS设置为逗号分隔的字符串列表,可以指定多个调度程序配置,或者在初始化参数文件中指定多个DISPATCHERS初始化参数。
如果多次指定DISPATCHERS,则它们在初始化参数文件中的行必须相邻。在内部,Oracle数据库为每个DISPATCHERS参数分配一个INDEX值(从0开始)。稍后您可以在ALTER SYSTEM语句中通过DISPATCHERS参数的索引号引用它。
# 1.这是设置DISPATCHERS初始化参数的典型示例: DISPATCHERS="(PROTOCOL=TCP)(DISPATCHERS=2)" # 2.下面的假设示例将创建两个调度程序,它们将监听指定的IP地址。 # 该地址必须是实例所在主机的有效IP地址。 DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)(HOST=144.25.16.201))(DISPATCHERS=2)" # 3.强制调度程序使用特定端口作为侦听端点,添加PORT属性如下所示: DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)(PORT=5000))" DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)(PORT=5001))" # 4.实践,关闭数据库,然后设置文本初始化参数文件,然后生成服务器参数文件: # (1)关闭数据库 shutdown immediate; # (2)修改文本初始化参数文件 vim initorcl.ora dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' dispatchers='(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.70)(PORT=4300))(DISP=2)' spfile='/u01/app/oracle/product/19.3.0.0/dbhome_1/dbs/spfileorcl.ora' # (3)生成服务器参数文件 sqlplus / as sysdba SYS@orcl> create spfile from pfile; File created. # (4)启动数据库,查看相关参数 SYS@orcl> startup; SYS@orcl> show parameter dispatchers; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ dispatchers string (PROTOCOL=TCP) (SERVICE=orclXD B), (ADDRESS=(PROTOCOL=TCP)(HO ST=10.0.0.70)(PORT=4300))(DISP =2) # 查看监听的端口 [root@oracle4 ~]# netstat -lntup | grep 4300 tcp 0 0 10.0.0.70:4300 0.0.0.0:* LISTEN 86479/ora_d001_orcl
复制
(4)修改调度程序的数量
您可以控制实例中调度程序进程的数量。与共享服务器的数量不同,调度程序的数量不会自动更改。您可以使用ALTER SYSTEM语句显式地更改调度程序的数量。您可以增加调度程序的数量,超过MAX_DISPATCHERS参数指定的限制。
a、监视以下视图,以确定调度程序进程上的负载:
- V$QUEUE:包含关于共享服务器消息队列的信息
- V$DISPATCHER:显示有关调度程序进程的信息。
- V$DISPATCHER_RATE:显示调度程序进程执行的许多活动的速率统计信息。
如果这些视图表明调度进程上的负载始终很高,那么可以通过启动额外的调度进程来路由用户请求来提高性能。相反,如果调度程序上的负载始终很低,那么减少调度程序的数量可能会提高性能。
# v$queue SYS@orcl> select * from v$queue; PADDR TYPE QUEUED WAIT TOTALQ CON_ID ---------------- ---------- ---------- ---------- ---------- ---------- 00 COMMON 0 0 21 0 00 COMMON 0 0 22 0 000000006F3CAD68 DISPATCHER 0 0 0 0 000000006F3CC2C8 DISPATCHER 0 0 43 0 000000006F3CD828 DISPATCHER 0 0 0 0
复制
b、在实例运行时动态更改调度程序的数量,可以使用alter SYSTEM语句修改现有调度程序配置的dispatchers属性设置。您还可以添加新的dispatcher配置来启动具有不同网络属性的调度程序。
当您为特定的调度程序配置减少调度程序的数量时,不会立即删除这些调度程序。相反,当用户断开连接时,Oracle数据库将终止调度程序,直到您在dispatchers中指定的限制。
# 将TCP/IP协议的调度程序的数量从2个增加到3个 SYS@orcl> alter system set dispatchers='(index=1)(disp=3)'; System altered. SYS@orcl> show parameter dispatchers; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ dispatchers string (PROTOCOL=TCP) (SERVICE=orclXD B), (DISPATCHERS=3)(ADDRESS=(P ROTOCOL=TCP)(HOST=10.0.0.70)(P ORT=4300)) # 如果TCP/IP当前存在的调度程序进程少于三个,数据库将创建新的调度程序进程。 # 查看进程 [oracle@oracle4 ~]$ ps -ef | grep d00 oracle 86475 1 0 09:07 ? 00:00:00 ora_d000_orcl oracle 86479 1 0 09:07 ? 00:00:00 ora_d001_orcl oracle 86481 1 0 09:07 ? 00:00:00 ora_d002_orcl oracle 102448 1 0 12:59 ? 00:00:00 ora_d003_orcl
复制
说明:不需要指定(DISP=1)。它是可选的,因为1是DISPATCHERS参数的默认值。
修改调度程序的注意事项:
- INDEX关键字可用于标识要修改的调度程序配置。如果不指定INDEX,则将修改与指定的DESCRIPTION、ADDRESS或PROTOCOL匹配的第一个调度程序配置。如果在现有的调度程序配置中没有找到匹配,那么将添加一个新的调度程序。
INDEX的值可以从0到n-1,其中n是当前配置的调度程序数量。如果您的ALTER SYSTEM语句指定INDEX值等于n,其中n是当前调度程序配置的数量,则将添加一个新的调度程序配置。 - 要查看当前调度程序配置的值,即调度程序的数量等,请查询VDISPATCHER_CONFIG动态性能视图。查询V dispatcher视图的CONF_INDX列,可以查看调度程序与哪个调度程序配置相关联。
- 当您更改调度程序配置的DESCRIPTION、ADDRESS、PROTOCOL、CONNECTIONS和MULTIPLEX属性时,更改不会对现有的调度程序生效,而只会对新的调度程序生效。
因此,为了使更改对与配置关联的所有调度程序生效,必须在更改dispatchers参数后强制终止现有的调度程序,并让数据库在它们的位置上启动具有指定属性的新的调度程序。
SYS@orcl> alter system set dispatchers='(index=1)(conn=1)(disp=2)'; System altered. [oracle@oracle4 ~]$ ps -ef | grep d00 oracle 86475 1 0 09:07 ? 00:00:00 ora_d000_orcl oracle 86479 1 0 09:07 ? 00:00:01 ora_d001_orcl oracle 86481 1 0 09:07 ? 00:00:00 ora_d002_orcl oracle 102448 1 0 12:59 ? 00:00:00 ora_d003_orcl oracle 122666 87169 0 18:07 pts/5 00:00:00 grep --color=auto d00 [oracle@oracle4 ~]$ kill -9 86479 [oracle@oracle4 ~]$ kill -9 86481 [oracle@oracle4 ~]$ kill -9 102448 [oracle@oracle4 ~]$ ps -ef | grep d00 oracle 86475 1 0 09:07 ? 00:00:00 ora_d000_orcl oracle 122781 87169 0 18:09 pts/5 00:00:00 grep --color=auto d00 [oracle@oracle4 ~]$ ps -ef | grep d00 oracle 86475 1 0 09:07 ? 00:00:00 ora_d000_orcl oracle 122800 1 0 18:09 ? 00:00:00 ora_d001_orcl oracle 122802 1 0 18:09 ? 00:00:00 ora_d002_orcl oracle 122961 87169 0 18:12 pts/5 00:00:00 grep --color=auto d00 # oracle数据库会自动帮你启动调动程序,之后通过端口4300连接oracle数据库
复制
LISTENER和SERVICES属性不受相同的约束。它们应用于与修改后的配置相关联的现有调度程序。只有当SESSIONS属性的值降低时,它才适用于现有的调度程序。但是,如果它的值增加,则只应用于新启动的调度程序。
(5)配置Oracle Net
只有使用Oracle Net连接数据库时,才能使用共享服务器,TNS中应配置调度程序监听的地址,而非监听器的监听地址,此时,监听器可有可无,如下所示:
vim tnsnames.ora testdg = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.70)(PORT = 4300)) ) (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = testdg)) ) # 连接数据库 sqlplus zb/123456@testdg # 查看连接所使用的服务器类型(server字段所示) select a.username,a.sid,a.serial#,a.server,a.paddr,a.process,a.status,b.spid from v$session a,v$process b where a.username=USER and a.paddr=b.addr;
复制
(6)关闭特定的调度程序进程
使用ALTER SYSTEM SET DISPATCHERS语句,将由数据库决定关闭哪些调度程序以减少调度程序的数量。或者,也可以关闭特定的调度程序进程。
# 1.使用V$DISPATCHER 动态性能视图可以识别要关闭的特定调度进程的名称: SYS@orcl> select name,network from v$dispatcher; NAME NETWORK ---- ------------------------------------------------------------ D000 (ADDRESS=(PROTOCOL=tcp)(HOST=oracle4)(PORT=20892)) D001 (ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.70)(PORT=4300)) D002 (ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.70)(PORT=4300)) # 每个调度程序都由一个形式Dnnn的名称唯一标识。 # 2.运行ALTER SYSTEM SHUTDOWN IMMEDIATE语句并指定调度程序名称,例如: SYS@orcl> alter system shutdown immediate 'D002'; System altered. # 命令执行成功之后,该调度程序在V$DISPATCHER中的accept字段变为NO # 表示该调度程序不会再接收新的连接 SYS@orcl> select name,network,accept from v$dispatcher where name='D002'; NAME NETWORK ACC ---- ------------------------------------------------------------ --- D002 (ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.70)(PORT=4300)) NO # 执行上述命令关闭调度程序进程之后,并不会杀掉操作系统级别的相关进程 [root@oracle4 ~]# ps -ef | grep d002 oracle 6703 1 0 22:16 ? 00:00:00 ora_d002_orcl
复制
IMMEDIATE关键字阻止调度程序接受新连接,数据库立即终止所有通过该调度程序的现有连接。在清理所有会话之后,调度程序进程将关闭。如果没有指定IMMEDIATE,那么调度程序将等待,直到所有用户断开连接,所有连接终止后才关闭。
5.禁用共享服务器
通过将SHARED_SERVERS初始化参数设置为0,可以禁用共享服务器。您可以使用ALTER SYSTEM语句动态地完成此操作。
SYS@orcl> alter system set shared_servers=0; System altered. # 要在所有共享服务器客户端断开连接后终止调度程序,输入以下语句: ALTER SYSTEM SET DISPATCHERS = '';
复制
当禁用共享服务器时,没有新的客户端可以以共享模式连接。但是,Oracle数据库保留一些共享服务器,直到所有共享服务器连接关闭。保留的共享服务器的数量要么是前面SHARED_SERVERS设置中指定的数量,要么是MAX_SHARED_SERVERS参数的值,两者取较小的值。如果SHARED_SERVERS和MAX_SHARED_SERVERS都设置为0,那么所有共享服务器都将终止,来自其余共享服务器客户端的请求将被排队,直到SHARED_SERVERS或MAX_SHARED_SERVERS的值再次提升。
6.共享服务器数据字典视图
View | Description |
---|---|
V$DISPATCHER | 提供关于调度程序进程的信息,包括名称、网络地址、状态、各种使用统计信息和索引号。 |
V$DISPATCHER_CONFIG | 提供关于调度程序的配置信息。 |
V$DISPATCHER_RATE | 提供调度程序进程的速率统计信息。 |
V$QUEUE | 包含关于共享服务器消息队列的信息。 |
V$SHARED_SERVER | 包含关于共享服务器的信息。 |
V$CIRCUIT | 包含关于虚拟电路的信息,虚拟电路是通过调度程序和服务器到数据库的用户连接。 |
V$SHARED_SERVER_MONITOR | 包含调优共享服务器的信息。 |
V$SGA | 包含关于各种系统全局区域(SGA)组的大小信息。可能在调优共享服务器时有用。 |
V$SGASTAT | 包含关于SGA的详细统计信息,对调优很有用。 |
V$SHARED_POOL_RESERVED | 列出统计信息,以帮助优化共享池中的预留池和空间。 |