DBMS_DBA系统包
📄字数 2.3K
👁️阅读量 加载中...
一、概述
DBMS_DBA系统包是对当前运行中的数据库会话和事务进行控制的关键工具之一,帮助管理员及时中止异常或占用过多资源的操作,保障系统的正常运行。其功能包括中止指定事务以及中止会话上的当前事务。
在该系统包中提供了以下接口:
包体函数名 | 简要描述 |
---|---|
KILL_TRANS | 中止指定事务 |
KILL_SESSION_TRANS | 中止会话的当前事务 |
典型应用场景,如:
- 某个事务长时间锁表或阻塞其他事务,使用 KILL_TRANS 精准中止该事务,释放锁资源
- 会话需要继续使用,但事务有误,需中止,使用KILL_SESSION_TRANS仅结束当前事务,避免用户完全断线
二、KILL_TRANS
2.1 功能描述
该接口用于强制中止指定数据库事务
提示
- 该操作必须在系统库下进行
- 当前用户需具有DBA权限
2.2 方法声明
sql
PROCEDURE KILL_TRANS(
NODEID INTEGER,
TRANID BIGINT
);
2.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
NODEID | INTEGER | 无 | 否 | 根事务节点号 |
TRANID | BIGINT | 无 | 否 | 根事务事务号 |
2.4 示例
sql
-- 查询系统表 SYS_SESSIONS
SQL> SELECT nodeid,session_id,ip,user_name,db_name,start_t,status,curr_tid,auto_commit,trans_start_t FROM SYS_SESSIONS;
+--------+------------+-----------+-----------+---------+--------------------------+--------+----------+-------------+--------------------------+
| NODEID | SESSION_ID | IP | USER_NAME | DB_NAME | START_T | STATUS | CURR_TID | AUTO_COMMIT | TRANS_START_T |
+--------+------------+-----------+-----------+---------+--------------------------+--------+----------+-------------+--------------------------+
| 1 | 0 | 127.0.0.1 | SYSDBA | SYSTEM | 2025-07-30 10:05:15.000 | 112 | | F | |
| 1 | 1 | 127.0.0.1 | SYSDBA | SYSTEM | 2025-07-30 10:07:55.000 | 114 | 42722 | T | 2025-07-30 10:08:02.000 |
+--------+------------+-----------+-----------+---------+--------------------------+--------+----------+-------------+--------------------------+
-- 中止指定会话的当前事务
SQL> EXEC DBMS_DBA.KILL_SESSION_TRANS(1,0);
-- 中止当前会话的当前事务
SQL> EXEC DBMS_DBA.KILL_SESSION_TRANS(1,1);
Error: [E14006] 不能中止当前会话
2.5 场景应用
- 场景一:某事务未提交,占用表、表锁,导致后续事务阻塞;此时可以中止阻塞事务,避免全局锁等待蔓延
- 场景二:某DML事务执行时间过长、数据量过大或出现异常卡顿,此时可以中止长时间运行或异常挂起的事务
- 场景三:某些事务长时间未提交,导致UNDO表空间异常膨胀,此时中止事务后,后台进行回滚,释放空间
三、KILL_SESSION_TRANS
3.1 功能描述
该接口用于中止会话的当前事务。相较于中止整个会话或中止指定事务,它只中止会话中当前处于活跃状态的事务,但保留连接本身。
提示
- 该操作必须在系统库下进行
- 当前用户需具有DBA权限
- 不允许中止当前会话上的当前事务
3.2 方法声明
sql
PROCEDURE KILL_SESSION_TRANS(
NODEID INTEGER,
SESSID INTEGER
);
3.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
NODEID | INTEGER | 无 | 否 | 会话节点号 |
SESSID | INTEGER | 无 | 否 | 会话标识号 |
3.4 示例
sql
-- 查询系统表 SYS_SESSIONS
SQL> SELECT nodeid,session_id,ip,user_name,db_name,start_t,status,curr_tid,auto_commit,trans_start_t FROM SYS_SESSIONS;
+--------+------------+-----------+-----------+---------+--------------------------+--------+----------+-------------+--------------------------+
| NODEID | SESSION_ID | IP | USER_NAME | DB_NAME | START_T | STATUS | CURR_TID | AUTO_COMMIT | TRANS_START_T |
+--------+------------+-----------+-----------+---------+--------------------------+--------+----------+-------------+--------------------------+
| 1 | 0 | 127.0.0.1 | SYSDBA | SYSTEM | 2025-06-20 15:18:55.000 | 114 | 1219 | T | 2025-06-20 16:59:09.000 |
+--------+------------+-----------+-----------+---------+--------------------------+--------+----------+-------------+--------------------------+
-- 中止指定会话的当前事务
SQL> EXEC DBMS_DBA.KILL_SESSION_TRANS(1,230494);
3.5 场景应用
- 场景一:某用户在操作大事务时,忘记提交或出现阻塞,影响其他会话,此时中止该事务,用户可继续后续操作