五、配置数据库常驻连接池
数据库服务器预先配置为允许数据库常驻连接池。但是,必须通过启动连接池显式启用此功能。
1.数据库常驻连接池初始化参数
使用DRCP_DEDICATED_OPT初始化参数配置使用数据库常驻连接池(DRCP)的专用优化。您可以通过将drcp_dedicated设置为Yes来启用专用优化。当到DRCP代理的连接数量小于DRCP最大大小时,专用优化使DRCP的行为像专用服务器一样。
配置身份验证池的初始化参数如下:
- AX_AUTH_SERVERS
指定认证池中认证服务器的最大数量。身份验证池与连接池分离,在客户机应用程序连接到DRCP时对用户连接进行身份验证。将该参数设置为一个大于MIN_AUTH_SERVERS初始化参数所指定值的正整数。 - MIN_AUTH_SERVERS
指定认证池中认证服务器的最小数量。将该参数设置为小于MAX_AUTH_SERVERS初始化参数指定的值的正整数。
2.启用数据库常驻连接池
Oracle数据库包含一个名为SYS_DEFAULT_CONNECTION_POOL的默认连接池。默认情况下,创建了这个池,但没有启动。要启用数据库常驻连接池,必须显式启动该连接池。
(1)启动数据库常驻连接池
## (1)启动SQL*Plus,以SYS用户连接数据库:
[oracle@oracle4 ~]$ sqlplus / as sysdba
SYS@orcl>
## (2)执行如下命令
SYS@orcl> exec dbms_connection_pool.start_pool();
PL/SQL procedure successfully completed.
一旦启动,连接池将保持此状态,直到显式停止。如果连接池在实例关闭时处于活动在Oracle Real Application Clusters (Oracle RAC)环境中,可以使用任何实例管理连接池。对池配置所做的任何更改都适用于所有Oracle RAC实例。状态,则在数据库实例重新启动时自动重新启动连接池。
(2)将客户端连接请求路由到连接池
在客户端应用程序中,连接字符串必须将连接类型指定为POOLED。
# 1.下面的例子展示了一个简单的连接字符串,它允许客户端连接到数据库常驻连接池:
sqlplus scott/[email protected]:1521/orcl:pooled
# 2.下面的例子展示了一个TNS连接描述符,它允许客户端连接到数据库常驻连接池:
orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.70)(PORT = 1521))
(CONNECT_DATA =
(SERVER = POOLED)
(SERVICE_NAME = orcl)
)
)
# 3.禁用数据库常驻连接池
# 要禁用数据库常驻连接池,必须显式停止连接池。
SYS@orcl> exec dbms_connection_pool.stop_pool();
PL/SQL procedure successfully completed.
# 成功执行上述命令之后,连接到数据库常驻连接池的现有会话将变得不可用
SQL> select * from dept;
select * from dept
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 37667
Session ID: 46 Serial number: 8378
注意:
- 只有TCP协议支持客户端连接到数据库常驻连接池.
- 只有当所有已传递给服务器的客户端请求都完成时,才能完成禁用数据库常驻连接池的操作。
3.为数据库常驻连接池配置连接池
连接池使用默认参数值配置。根据您的使用情况您可以使用DBMS_CONNECTION_POOL包中的过程来配置连接池。在Oracle RAC环境中,配置参数适用于每个Oracle RAC实例。
(1)使用CONFIGURE_POOL过程
DBMS_CONNECTION_POOL包的CONFIGURE_POOL过程使您能够使用高级选项配置连接池。当您必须修改连接池的所有参数时,通常使用此过程。
(2)使用ALTER_PARAM过程
DBMS_CONNECTION_POOL包的ALTER_PARAM过程使您能够更改特定的配置参数而不影响其他参数。
# 1.下面的命令修改了使用的池服务器的最小数量:
SYS@orcl> exec dbms_connection_pool.alter_param('','MINSIZE','10');
PL/SQL procedure successfully completed.
# 2.将每个连接代理可以处理的最大连接数更改为5000。
SYS@orcl> exec dbms_connection_pool.alter_param('','MAXCONN_CBROK','5000');
PL/SQL procedure successfully completed.
# 在执行此命令之前,请确保安装数据库的平台所允许的最大连接数不小于MAXCONN_CBROK设置的值。
例如,在Linux操作系统中,/etc/security/limits.conf文件中如下内容表示用户test_user允许的最大连接数为30000。
test_user HARD NOFILE 30000
要将每个连接代理允许的最大连接数设置为50000,首先将limits.conf文件中的值更改为不小于50000的值。
(3)恢复连接池默认设置
如果您更改了连接池参数,但希望恢复到默认池设置,请使用DBMS_CONNECTION_POOL包的RESTORE_DEFAULT过程。
SYS@orcl> exec dbms_connection_pool.restore_defaults();
PL/SQL procedure successfully completed.
数据库常驻连接池的配置参数:
参数名 | 描述 |
MINSIZE | 池中池服务器的最小值。默认值为4 |
MAXSIZE | 池中池服务器的最大数量。缺省值为40。连接池保留5%的池服务器用于身份验证,并且始终至少保留一个池服务器用于身份验证。 设置此参数时,请确保有足够的池服务器用于身份验证和连接。 |
INCRSIZE | 当接收到客户端应用程序请求时,如果服务器不可用,则增加池中服务器的数量。缺省值为2。 |
SESSION_CACHED_CURSORS | 在每个池服务器会话中要缓存的会话游标的数量。缺省值为20。 |
INACTIVITY_TIMEOUT | 池服务器可以在池中保持空闲的最长时间(以秒为单位)。在此之后,服务器将终止。缺省值是300。如果池处于MINSIZE,则此参数不适用。 |
MAX_THINK_TIME | 客户端从池中获取池服务器后不活动的最长时间,以秒为单位。 从池中获取池服务器后,如果客户机应用程序在MAX_THINK_TIME指定的时间内没有发出数据库调用,则释放池服务器并终止客户机连接。因此,如果在这样的连接上尝试一个往返调用,应用程序可能会遇到ORA-3113或ORA-3115错误。 |
MAX_TXN_THINK_TIME | 客户端从池中获取池服务器后的开启事务不活动的最大时间,以秒为单位。从池中获得池服务器后,如果客户机应用程序在MAX_TXN_THINK_TIME指定的时间内没有发出数据库调用,则释放池服务器,并终止客户机连接。该参数的默认值是MAX_THINK_TIME参数的值。应用程序可以将MAX_TXN_THINK_TIME参数的值设置为高于MAX_THINK_TIME的值,以允许打开事务的连接有更多的时间。 |
MAX_USE_SESSION | 可以从池中获取和释放的服务器次数。缺省值为500000。 |
MAX_LIFETIME_SESSION | 池中的池服务器的生存时间,以秒为单位。缺省值为86400(24小时)。 |
NUM_CBROK | 为处理客户端请求而创建的连接代理的数量。缺省值为1。如果存在大量客户端应用程序,创建多个连接代理进程有助于分配客户端连接请求的负载。 |
MAXCONN_CBROK | 每个连接代理程序可以处理的最大连接数。缺省值为40000。但是,如果安装数据库的平台允许的最大连接小于默认值,则此值将覆盖使用MAXCONN_CBROK设置的值。将操作系统的每进程文件描述符限制设置得足够高,以支持MAXCONN_CBROK指定的连接数。 |
4.数据库常驻连接池的数据字典视图
您可以查询数据字典视图,以获取有关连接池的信息,并监视数据库常驻连接池的性能。
视图 | 描述 |
DBA_CPOOL_INFO | 包含有关连接池的信息,例如连接池状态、最大和最小连接数以及空闲会话的超时时间。 |
V$CPOOL_CONN_INFO | 包含到连接代理的每个连接的有关信息。(当使用sqlplus scott/[email protected]/orcl:pooled连接数据库时,该视图中就会产生一条记录) |
V$CPOOL_STATS | 包含池统计信息,例如会话请求的数量、在池中找到与请求匹配的会话的次数以及会话请求的总等待时间。 |
V$CPOOL_CC_INFO | 包含关于池与连接类映射的信息。 |
V$CPOOL_CC_STATS | 包含池的连接类级别统计信息。 |
5.确定连接池中连接的状态
您可以查询V $ CPOOL_CONN_INFO视图,以确定连接池中的每个连接的当前状态。例如,您可以确定哪些连接繁忙或空闲。
当连接到连接池的会话空闲时间超过视图dba_cpool_info中字段max_think_time值时,则会断开连接。
# 1.对于自己的测试机,该视图一开始并没有记录,所以我们需要开启连接池,然后以连接池的方式连接到数据库
exec dbms_connection_pool.start_pool();
[root@OG1 ~]# sqlplus scott/[email protected]:1521/orcl:pooled
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 21 09:48:32 2022
Version 19.17.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Last Successful login time: Sun Nov 20 2022 22:53:28 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
# 2.确定连接等待的时间
select username,service,last_wait_time from v$cpool_conn_info where connection_status= 'WAITING';
# 3.确定连接已激活的时间
SYS@orcl> select username,service,last_active_time from v$cpool_conn_info where connection_status = 'ACTIVE';
USERNAME SERVICE LAST_ACTIVE_TIME
------------------------------ ---------------------------------------- ----------------
SCOTT orcl 3748095
# 4.列出运行时间最长的活动连接
SYS@orcl> select username,service,active_time from v$cpool_conn_info where connection_status = 'ACTIVE' order by active_time desc;
USERNAME SERVICE ACTIVE_TIME
------------------------------ ---------------------------------------- -----------
SCOTT orcl 4945377
59454346
# 5.确定等待队列中最老连接的等待时间
SELECT USERNAME, SERVICE, LAST_WAIT_TIME
FROM V$CPOOL_CONN_INFO
WHERE LAST_WAIT_TIME = (
SELECT max(LAST_WAIT_TIME)
FROM V$CPOOL_CONN_INFO
WHERE CONNECTION_STATUS = 'WAITING');
六、Oracle数据库后台进程简介
为了最大化性能和适应多用户,多进程Oracle数据库系统使用后台进程。后台进程为每个用户进程整合了那些可能需要运行多个数据库程序处理的功能。后台进程异步执行I/O并监视其他Oracle数据库进程,为取得更好的性能和可靠性提供并行性。
基本后台进程如下表所示。使用额外的数据库功能或选项可能导致出现更多的后台进程。例如:
- 当您使用Oracle数据库高级队列时,会存在队列监视器(QMNn)后台进程。
- 当您将FILE_MAPPING初始化参数设置为true以将数据文件映射到存储子系统上的物理设备时,将出现FMON进程。
如果您使用Oracle自动存储管理(Oracle ASM),则会出现额外的Oracle ASM特定的后台进程。
进程名 | 描述 |
Database writer (DBWn or BWnn) | 数据库写入器将修改过的块从数据库缓冲区缓存写入数据文件。 Oracle数据库允许最多100个数据库写进程。前36个数据库写进程名称为DBW0-DBW9和DBWa-DBWz。第37到第100个数据库写进程的名称是BW36-BW99。DB_WRITER_PROCESSES初始化参数指定数据库写进程的数量。 数据库会为这个初始化参数选择一个适当的默认设置,或者根据cpu的数量和处理器组的数量调整用户指定的设置。 |
Log writer (LGWR) | 日志写入进程将重做日志条目写入磁盘。重做日志条目生成在系统全局区域(SGA)的重做日志缓冲区中。 LGWR将重做日志条目按顺序写入重做日志文件。如果数据库有复用重做日志,则LGWR将重做日志条目写入一组重做日志文件。 |
Checkpoint (CKPT) | 在特定的时间,DBWn会将系统全局区域中所有修改过的数据库缓冲区写入数据文件。这个事件称为检查点。检查点进程负责在检查点发生时向DBWn发送信号,并更新数据库的所有数据文件和控制文件,以指示最近的检查点。 |
System monitor (SMON) | 当失败的实例再次启动时,系统监视器执行恢复。 在Oracle Real Application Clusters数据库中,一个实例的SMON进程可以为其他失败的实例执行实例恢复。SMON 还会清理不再使用的临时段,并恢复在系统故障和实例恢复期间由于文件读取或脱机错误而跳过的已终止事务。当表空间或文件重新联机时,这些事务最终由SMON恢复。 |
Process monitor (PMON) | 进程监视器在用户进程失败时执行进程恢复。 PMON负责检测失败的进程。然后PMON负责协调CLMN进程和CLnn从进程执行的清理工作。清理将释放进程正在使用的资源。 |
Archiver (ARCn) | 当重做日志文件已满或发生日志切换时,一个或多个归档进程将重做日志文件复制到归档存储中。 |
Recoverer (RECO) | 恢复进程用于解决由于分布式数据库中的网络或系统故障而挂起的分布式事务。每隔一定时间,本地RECO会尝试连接到远程数据库,并自动完成任何挂起的分布式事务的本地部分的提交或回滚。 |
Dispatcher (Dnnn) | 调度程序是可选的后台进程,只有在使用共享服务器配置时才会出现。 |
七、管理预生成进程
Oracle数据库可以预生成进程以获得更好的客户端连接性能。
1.关于管理预生成进程
Oracle数据库可以在进程池中预生成前台和后台进程。
当启用专用代理或启用线程执行模式时,Oracle数据库将预生成前台进程。当需要前台进程时,它使用内部预生成的进程以减少创建时间。当threaded_execution初始化参数设置为TRUE时,数据库以线程执行模式运行。当该参数设置为FALSE时,默认情况下,数据库运行在进程模式下,Oracle数据库不会在进程池中预生成前台和后台进程。
当进程预先生成时,客户机连接更高效。如果启用了线程执行模式,Oracle数据库默认在不同的请求池中预生成进程。每个请求池用于不同类型的进程。V$PROCESS_POOL视图显示了这些池的信息,您可以使用DBMS_PROCESS包管理这些池。
2.管理预生成进程的池
可以使用DBMS_PROCESS包来配置和修改前台进程池中预生成进程的数量。Oracle数据库可以创建进程池来提高客户端连接的效率。您可以使用DBMS_PROCESS包来管理这些池。通过查询V$PROCESS_POOL视图可以查看当前进程池。
只有当数据库运行在多线程Oracle数据库模型中时,才会创建进程池。
# 1.启用线程执行模式,然后重启数据库
SYS@orcl> alter system set threaded_execution = true scope=spfile;
System altered.
SYS@orcl> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@orcl> startup;
# 中途可能会断开,此时数据库处于started状态,再次连接:
sqlplus sys/oracle123 as sysdba
alter database mount;
alter database open;
# 2.使用具有SYSDBA管理权限的用户连接数据库
sqlplus sys/oracle123 as sysdba
# 3.查看v$PROCESS_POOL视图
SYS@orcl> col pool_name for a30;
SYS@orcl> set linesize 200;
SYS@orcl> select * from v$process_pool;
POOL_NAME ENABL MIN_COUNT BATCH_COUNT INIT_COUNT CUR_COUNT MAX_COUNT CON_ID
------------------------------ ----- ---------- ----------- ---------- ---------- ---------- ----------
SYS_DEFAULT_FOREGROUND_POOL TRUE 10 20 28 28 28 0
# 4.停止SYS_DEFAULT_FOREGROUND_POOL进程池
SYS@orcl> exec DBMS_PROCESS.STOP_POOL('SYS_DEFAULT_FOREGROUND_POOL');
PL/SQL procedure successfully completed.
SYS@orcl> col pool_name for a30;
SYS@orcl> select pool_name,enabled from v$process_pool;
POOL_NAME ENABL
------------------------------ -----
SYS_DEFAULT_FOREGROUND_POOL FALSE
1 row selected.
## 当进程池停止时,V$PROCESS_POOL视图中的ENABLED列为FALSE。
# 5.启动进程池
SYS@orcl> exec DBMS_PROCESS.START_POOL('SYS_DEFAULT_FOREGROUND_POOL');
PL/SQL procedure successfully completed.
SYS@orcl> select pool_name,enabled from v$process_pool;
POOL_NAME ENABL
------------------------------ -----
SYS_DEFAULT_FOREGROUND_POOL TRUE
1 row selected.
# 6.配置进程池
## 查看进程池当前的配置
COLUMN POOL_NAME FORMAT A30
COLUMN ENABLED FORMAT A7
COLUMN MIN_COUNT FORMAT 9999999
COLUMN BATCH_COUNT FORMAT 9999999
COLUMN INIT_COUNT FORMAT 9999999
SELECT POOL_NAME, ENABLED, MIN_COUNT, BATCH_COUNT, INIT_COUNT
FROM V$PROCESS_POOL;
POOL_NAME ENABLED MIN_COUNT BATCH_COUNT INIT_COUNT
------------------------------ ------- --------- ----------- ----------
SYS_DEFAULT_FOREGROUND_POOL TRUE 10 20 23
1 row selected.
## 对于该进程池,将预生成进程的最小数量更改为20,
## 将批处理中创建的预生成进程的数量更改为30,将初始预生成进程的数量更改为40
SYS@orcl> begin
2 dbms_process.configure_pool(
3 pool_name => 'SYS_DEFAULT_FOREGROUND_POOL',
4 min_count => 20,
5 batch_count => 30,
6 init_count => 40);
7 end;
8 /
PL/SQL procedure successfully completed.
# 查询验证
SYS@orcl> select pool_name,min_count,batch_count,init_count from v$process_pool;
POOL_NAME MIN_COUNT BATCH_COUNT INIT_COUNT
------------------------------ --------- ----------- ----------
SYS_DEFAULT_FOREGROUND_POOL 20 30 40
八、管理并行SQL执行的进程
您可以管理SQL语句的并行处理。在这种配置中,Oracle数据库可以将处理SQL语句的工作分配给多个并行进程。
注意:本节中描述的并行执行特性在Oracle数据库企业版中提供。
1.关于并行执行服务器
许多SQL语句的执行可以并行化。并行度是指可以与单个操作相关联的并行执行服务器的数量。
并行度由以下任何一个决定:
- 语句中的PARALLEL子句
- 对于查询中引用的对象,在创建或修改对象时使用的PARALLEL子句
- 插入到语句中的并行提示
- 由数据库决定的默认值
当一个实例启动时,Oracle数据库创建一个并行执行服务器池,可用于任何并行操作。一个称为并行执行协调器的进程调度一个并行执行服务器池的执行,并协调从所有这些并行执行服务器向用户发送结果。
默认情况下,并行执行服务器是启用的,因为PARALLEL_MAX_SERVERS初始化参数值默认设置为大于0。这些进程可供各种能够利用并行性的Oracle数据库特性使用。数据库为大多数用户调优了相关的初始化参数,但是您可以根据需要更改它们以适应您的环境。为了便于调优,可以动态更改一些参数。
并行可以被数个特性使用,包括事务恢复、复制和SQL执行。在并行SQL执行的情况下,并行执行服务器进程在语句的整个执行阶段都与语句保持关联。当语句被完全处理后,这些进程就可以用于处理其他语句。
说明:要禁用数据库中的并行SQL执行,请将PARALLEL_MAX_SERVERS初始化参数值设置为0。
2.更改会话的并行执行
可以使用ALTER session语句控制会话的并行SQL执行。
(1)禁用SQL并行执行
使用ALTER SESSION disable parallel DML|DDL|QUERY语句禁用并行SQL执行。在下达执行这样的语句后,所有后续的DML (INSERT、UPDATE、DELETE)、DDL (CREATE、ALTER)或查询(SELECT)操作将串行执行。它们将被串行执行,而不管与表或所涉及的索引相关的任何并行属性。但是,带有PARALLEL提示的语句会覆盖会话设置。
# 1.禁用并行DDL操作
SYS@orcl> alter session disable parallel ddl;
Session altered.
(2)启用并行SQL执行
使用ALTER SESSION enable parallel DML|DDL|QUERY语句可以启用并行SQL执行。随后,当PARALLEL子句或并行提示与语句相关联时,这些DML、DDL或查询语句将并行执行。默认情况下,DDL和查询语句启用了并行执行。
# 1.只有当您专门发出ALTER SESSION语句来启用并行DML时,DML语句才能被并行化
SYS@orcl> alter session enable parallel dml;
Session altered.
(3)强制并行SQL执行
可以使用ALTER SESSION force parallel DML|DDL| query语句强制并行执行所有后续的DML、DDL或查询语句。
您可以强制执行特定的并行度,覆盖与后续语句关联的任何PARALLEL子句。如果在ALTER SESSION语句中没有指定并行度,则使用默认的并行度。语句级并行提示覆盖强制并行度。对于表级并行提示,行为取决于是否为所有表提供了提示。如果所有表都包含表级并行提示,则使用这些提示中的最大值。如果至少有一个表不包含表级并行提示,则使用的并行度是所有并行提示和ALTER SESSION命令中指定的并行度中的较大者。
# 1.以下语句强制并行执行后续语句,并覆盖并行度为5
SYS@orcl> alter session force parallel ddl parallel 5;
Session altered.
九、管理外部过程进程
外部过程是用编程语言编写并存储在共享库中的程序或函数。Oracle服务器可以使用PL/SQL例程调用外部过程或函数。
1.关于外部过程
外部过程是用编程语言(如C、c++或Java)编写的过程,在数据库外部编译和存储,然后由用户会话调用。例如,PL/SQL程序单元可以调用一个或多个执行特殊目的处理所需的C例程。
这些可调用例程存储在动态链接库 (DLL) 中,如果是 Java 类方法,则存储在 libunit 中,并使用基本语言注册。Oracle数据库提供了一个特殊用途的接口,调用规范(call spec),它允许用户调用外部过程。
当用户会话调用外部过程时,数据库在数据库主机上启动外部过程代理。代理的默认名称为extproc。每个会话都有自己的专用代理。(可选)您可以创建凭据,以便代理以特定操作系统用户身份运行。当会话终止时,数据库终止其代理。
用户应用程序将DLL或libunit的名称、外部过程的名称和任何相关参数传递给外部过程代理。然后,外部过程代理加载DLL或libunit,运行外部过程,并将外部过程返回的任何值传回应用程序。
2.用于启用外部过程调用的 DBA 任务
为了启用外部过程调用,您必须修改侦听器和管理库。
启用外部过程调用可能涉及以下DBA任务:
- 配置监听器以启动extproc代理
默认情况下,数据库启动extproc进程。在以下情况下,必须更改此默认配置,以便侦听器启动extproc进程:
- 您需要使用多线程extproc代理
- 数据库在Windows操作系统上以共享服务器模式运行
- LIBRARY规范中的AGENT子句或PROCEDURE或FUNCTION规范中的AGENT in子句将外部过程重定向到不同的extproc代理
- 管理库或授予与管理库相关的特权
数据库需要通过一个称为库的模式对象来访问DLL语句。出于安全考虑,默认情况下,只有DBA角色的用户可以创建和管理库。因此,你可能会被要求:
- 使用Create directory语句为库的位置创建一个目录对象。创建目录对象之后,CREATE LIBRARY语句可以为库的位置指定目录对象。
- 使用DBMS_CREDENTIAL.CREATE_CREDENTIAL PL/SQL 过程创建凭据。在创建凭据之后,CREATE LIBRARY语句可以将凭据与库关联起来,以便作为特定的操作系统用户运行extproc代理。
- 使用CREATE LIBRARY语句创建开发人员需要的库对象。
授予开发人员以下权限:CREATE LIBRARY, CREATE ANY LIBRARY, ALTER ANY LIBRARY, EXECUTE ANY LIBRARY, EXECUTE ON library_name和EXECUTE ON directory_object。
十、终止会话
有时有必要终止当前用户会话。 例如,您可能希望执行一个管理操作,并需要终止所有非管理会话。
1.关于终止会话
当一个会话终止时,该会话的任何活动事务都将回滚,由该会话持有的资源(如锁和内存区域)将立即释放,并可用于其他会话。
使用SQL语句ALTER SYSTEM KILL session终止当前会话。
# 1.例如,终止系统标识为7,序列号为15的会话
ALTER SYSTEM KILL SESSION '7,15';
也可以在当前实例使用DBMS_SERVICE.DISCONNECT_SESSION过程终止具有服务名的会话。
2.确定要终止哪个会话
要确定要终止哪个会话,请指定会话索引号和序列号。
# 1.标识会话的SID (system identifier)和序列号:查询V$SESSION动态性能视图
SYS@orcl> select sid,serial#,status from v$session where username = 'SCOTT';
SID SERIAL# STATUS
---------- ---------- --------
259 38762 INACTIVE
当会话对Oracle数据库进行SQL调用时,会话是ACTIVE的。如果会话没有对数据库进行SQL调用,则会话为INACTIVE。
3.终止活动会话
如果一个用户会话在你终止会话时正在处理一个事务(ACTIVE状态),那么该事务将被回滚,用户将立即收到以下消息:
ORA-00028: your session has been killed
如果用户在收到ORA-00028消息后,在重新连接数据库之前提交额外的语句,Oracle数据库将返回以下消息:
ORA-01012: not logged on
活动会话在执行网络I/O或回滚事务时不能中断。在操作完成之前,不能终止这样的会话。在这种情况下,会话将持有所有资源,直到它被终止。此外,发出 ALTER SYSTEM 语句以终止会话的会话最多等待 60 秒,以便会话终止。如果不能中断的操作持续超过一分钟,ALTER SYSTEM语句的发起者将收到一条消息,指示会话已被标记为终止。标记为终止的会话在 V$SESSION 中指示,状态为 KILLED 且服务器不是 PSEUDO。
如果您正在使用Application Continuity,那么在会话终止时将恢复活动会话的活动。如果在终止会话后不希望恢复会话,则可以在ALTER SYSTEM语句中包含NOREPLAY关键字。
# 例如,以下语句指定的会话不会被恢复
ALTER SYSTEM KILL SESSION '7,15' NOREPLAY;
如果使用DBMS_SERVICE.DISCONNECT_SESSION过程来终止一个或多个会话,然后可以将disconnect_option参数值指定为DBMS_SERVICE.NOREPLAY,指示会话不应由Application Continuity恢复。
# 例如,断开与服务sales.example.com的所有会话,并指定不应恢复会话
BEGIN
DBMS_SERVICE.DISCONNECT_SESSION(
service_name => 'sales.example.com',
disconnect_option => DBMS_SERVICE.NOREPLAY);
END;
/
4.终止非活动会话
如果会话终止时没有对Oracle数据库进行SQL调用(为INACTIVE),则不会立即返回ORA-00028消息。直到用户随后尝试使用被终止的会话时,才返回该消息。
当一个非活动的会话被终止时,该会话在V$ session视图中的STATUS为KILLED。当用户再次尝试使用该会话并收到ORA-00028消息时,该被终止会话的行将从V$ session中删除。
在下面的示例中,终止了一个不活动的会话。首先查询V$SESSION,确定会话的SID和SERIAL#,然后终止会话。
# 1.确定要终止会话的sid和序列号
SYS@orcl> select sid,serial#,status from v$session where username = 'SCOTT';
SID SERIAL# STATUS
---------- ---------- --------
50 56094 KILLED
# 2.终止会话
SYS@orcl> alter system kill session '50,56094';
System altered.
# 3.查看该会话的状态
SYS@orcl> select sid,serial#,status from v$session where username = 'SCOTT';
SID SERIAL# STATUS
---------- ---------- --------
50 56094 KILLED
# 4.尝试使用上述被终止的会话
SQL> select * from dept;
select * from dept
*
ERROR at line 1:
ORA-00028: your session has been killed
# 5.再次查看上述会话信息,发现上述会话信息已经从v$session视图中删除
SYS@orcl> select sid,serial#,status from v$session where username = 'SCOTT';
no rows selected
5.取消会话中的SQL语句
可以使用ALTER SYSTEM CANCEL SQL语句取消会话中的SQL语句。
您可以取消会话中的高负载SQL语句,而不是终止会话。当您取消DML语句时,该语句将被回滚。
在ALTER SYSTEM CANCEL SQL语句中需要以下子句:
- SID – 会话 ID
- SERIAL – 会话序列号
以下子句在ALTER SYSTEM CANCEL SQL语句中是可选的:
- INST_ID – 实例ID
- SQL_ID – SQL语句的SQL ID
可以通过查询GV$ session视图查看会话的相关信息。
# 1.取消SQL语句的语法
ALTER SYSTEM CANCEL SQL 'SID, SERIAL, @INST_ID, SQL_ID';
# 2.例如:取消会话标识符为20、会话序列号为51142、SQL ID为8vu7s907prbgr的SQL语句
ALTER SYSTEM CANCEL SQL '20, 51142, 8vu7s907prbgr';
注意:
- 如果不指定@INST_ID,则使用当前会话的实例ID。
- 如果不指定SQL_ID,则终止指定会话中当前运行的SQL语句。