暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Administrator's Guide(Oracle 19c):5.10 Terminating Sessions

原创 Ryan Bai 2025-05-22
605

有时需要终止当前用户会话。例如,您可能希望执行管理操作,并且需要终止所有非管理会话。

关于终止会话

当会话终止时,会话的任何活动事务都回滚,会话所持有的资源(如锁和内存区域)立即被释放,并可用于其他会话。

使用 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 视图中的 STATUSKILLED。当用户再次尝试使用会话并接收到 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——会话ID
  • SERIAL——会话序列号

ALTER SYSTEM CANCEL SQL 语句中,下列子句是可选的:

  • INST_ID——实例 ID
  • SQL_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';
最后修改时间:2025-05-22 18:00:39
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论