有时需要终止当前用户会话。例如,您可能希望执行管理操作,并且需要终止所有非管理会话。
关于终止会话
当会话终止时,会话的任何活动事务都回滚,会话所持有的资源(如锁和内存区域)立即被释放,并可用于其他会话。
使用 SQL 语句 ALTER SYSTEM KILL 会话终止当前会话。以下语句终止系统标识符为7、序列号为15的会话:
ALTER SYSTEM KILL SESSION '7,15';
您还可以使用 DBMS_SERVICE.DISCONNECT_SESSION 过程,用于终止当前实例中带有命名服务的会话。
确定终止哪个会话
要确定终止哪个会话,请指定会话索引号和序列号。
识别会话的系统标识符(SID)和序列号:
- 查询
V$SESSION动态性能视图。
例如,下面的查询标识了用户 jward 的所有会话:
SELECT SID, SERIAL#, STATUS
FROM V$SESSION
WHERE USERNAME = 'JWARD';
SID SERIAL# STATUS
----- --------- --------
7 15 ACTIVE
12 63 INACTIVE
会话在对 Oracle 数据库进行 SQL 调用时是 ACTIVE 的。如果会话没有对数据库进行 SQL 调用,则会话是 INACTIVE 的。
终止一个活动会话
当您终止会话时,如果用户会话正在处理事务(ACTIVE 状态),则事务将回滚,用户将立即收到以下消息:
ORA-00028: your session has been killed
如果在接收到 ORA-00028 消息后,用户在重新连接到数据库之前提交了额外的语句,那么 Oracle 数据库将返回以下消息:
ORA-01012: not logged on
活动会话在执行网络 I/O 或回滚事务时不能被中断。在操作完成之前,不能终止这样的会话。在本例中,会话持有所有资源,直到终止为止。此外,发出 ALTER SYSTEM 语句来终止会话的会话最多要等待60秒才能终止会话。如果不能中断的操作持续超过一分钟,那么 ALTER SYSTEM 语句的发布者将收到一条消息,指示会话已被标记为已终止。标记为 KILLED 的会话在 V$SESSION 中表示,其状态为已终止,并且服务器不是 PSEUDO.。
如果使用应用程序连续性,则在会话终止时恢复活动会话的活动。如果您不想在终止会话之后恢复会话,那么您可以在 ALTER SYSTEM 语句中包含 NOREPLAY 关键字。例如,下面的语句指定会话将不会被恢复:
ALTER SYSTEM KILL SESSION '7,15' NOREPLAY;
如果使用 DBMS_SERVICE.DISCONNECT_SESSION 过程终止一个或多个会话,然后可以为 disconnect_option 参数指定 DBMS_SERVICE.NOREPLAY,以表明应用程序连续性不应该恢复会话。例如,要断开与 sales.example.com 服务的所有会话,并指定会话不应该被恢复,请运行以下过程:
BEGIN
DBMS_SERVICE.DISCONNECT_SESSION(
service_name => 'sales.example.com',
disconnect_option => DBMS_SERVICE.NOREPLAY);
END;
/
终止非活动会话
如果会话终止时没有对 Oracle 数据库进行 SQL 调用(处于非活动 INACTIVE),则不会立即返回 ORA-00028 消息。直到用户随后尝试使用终止的会话,消息才会返回。
当非活动会话终止时,会话在 V$SESSION 视图中的 STATUS 为 KILLED。当用户再次尝试使用会话并接收到 ORA-00028 消息后,终止会话的行将从 V$SESSION 中删除。
在下面的示例中,终止不活动的会话。首先,查询 V$SESSION 来标识会话的 SID 和序列号,然后终止会话。
SELECT SID,SERIAL#,STATUS,SERVER
FROM V$SESSION
WHERE USERNAME = 'JWARD';
SID SERIAL# STATUS SERVER
----- -------- --------- ---------
7 15 INACTIVE DEDICATED
12 63 INACTIVE DEDICATED
2 rows selected.
ALTER SYSTEM KILL SESSION '7,15';
Statement processed.
SELECT SID, SERIAL#, STATUS, SERVER
FROM V$SESSION
WHERE USERNAME = 'JWARD';
SID SERIAL# STATUS SERVER
----- -------- --------- ---------
7 15 KILLED PSEUDO
12 63 INACTIVE DEDICATED
2 rows selected.
在会话中取消SQL语句
您可以使用 ALTER SYSTEM CANCEL SQL 语句在会话中取消 SQL 语句。
您可以取消会话中的高负载 SQL 语句,而不是终止会话。当您取消 DML 语句时,将回滚该语句。
ALTER SYSTEM CANCEL SQL 语句中需要使用以下语句:
SID——会话IDSERIAL——会话序列号
在 ALTER SYSTEM CANCEL SQL 语句中,下列子句是可选的:
INST_ID——实例 IDSQL_ID——SQL 语句的 SQL ID
您可以通过查询 GV$SESSION 视图来查看会话的此信息。
下面是取消 SQL 语句的语法:
ALTER SYSTEM CANCEL SQL 'SID, SERIAL, @INST_ID, SQL_ID';
下面的示例取消了一个 SQL 语句,该语句的会话标识符为 20,会话序列号为 51142,SQL ID 为 8vu7s907prbgr:
ALTER SYSTEM CANCEL SQL '20, 51142, 8vu7s907prbgr';




