一、脚本功能
该工具为Oracle数据库中指定会话的批量清理批处理脚本,主要应用于以下场景:
- 清除特定客户端产生的异常连接
- 批量终止来自两个预设主机的JDBC类型连接
- 释放被长期占用或卡住的数据库资源
二、使用方法
执行方式
[oracle@vvml-yz-oracle~]$ ./kill.sh
执行效果简述
自动识别并强制中断所有来自以下两台主机的JDBC客户端连接:
vvml-tx-vv-comment
vvml-tx-vv-security
三、脚本组成与逻辑解析
1. kill.sh(主控脚本)
作为整个流程的入口,负责调用SQL生成器并执行输出结果。
#!/bin/bash
source ~/.bash_profile # 加载Oracle运行环境变量
sqlplus -s / as sysdba @generate_os_kill_commands.sql > os_kill_commands.sh # 执行SQL生成kill命令脚本
chmod +x os_kill_commands.sh # 赋予生成脚本可执行权限
./os_kill_commands.sh # 立即运行生成的清理指令
2. generate_os_kill_commands.sql(命令动态生成脚本)
通过查询Oracle系统视图,构造出对应操作系统级别的kill命令。
-- 核心SQL:根据会话信息生成操作系统级kill命令
SELECT
'echo "Killing ' || s.sid || ',' || s.serial# || ' - PID: ' || p.spid || '" && ' ||
'kill -9 ' || p.spid || ' # ' || s.machine || ' - ' || s.status
FROM v$session s, v$process p
WHERE s.paddr = p.addr -- 关联会话与OS进程
AND s.machine IN ('vvml-tx-vv-comment.10.10.10.1', 'vvml-tx-vv-security.10.10.10.2') -- 指定目标主机
AND s.program = 'JDBC Thin Client' -- 仅限JDBC连接
AND s.status IN ('KILLED', 'ACTIVE', 'INACTIVE') -- 包含多种状态的会话
ORDER BY s.machine, s.last_call_et DESC;
3. 清理脚本输出示例
由上述SQL生成的实际可执行shell脚本内容如下:
# os_kill_commands.sh 示例内容:
echo "Killing 123,45678 - PID: 78901" && kill -9 78901 # vvml-tx-vv-comment.10.10.10.1 - ACTIVE
echo "Killing 234,56789 - PID: 89012" && kill -9 89012 # vvml-tx-vv-security.10.10.10.2 - INACTIVE
四、核心特性说明
清理范围(将终止哪些连接)
- 来源为主机IP为 vvml-tx-vv-comment.10.10.10.1 和 vvml-tx-vv-security.10.10.10.2 的连接
- 程序类型为 JDBC Thin Client 的数据库会话
- 状态属于 KILLED、ACTIVE 或 INACTIVE 的任意一种
清理机制
- 采用操作系统层面的强制杀进程方式:
kill -9
- 每条命令前先输出提示信息,便于日志追踪
- 按主机分组,并依据最后一次调用时间倒序排列,优先处理空闲最久的连接
五、使用注意事项
- 强制性操作:使用
kill -9
命令直接终止进程,虽不优雅但确保彻底清除
- 权限需求:执行用户需具备在操作系统上执行 kill 命令的权限
- 无确认机制:一旦运行,所有符合条件的连接将被立即终止,不会进行二次提示
- 适用时机:建议仅在紧急故障处理或系统维护窗口期间使用
六、执行流程图示
运行 kill.sh
↓
加载 Oracle 环境配置(.bash_profile)
↓
通过 sqlplus 执行 SQL 脚本生成 kill 命令集
↓
将输出重定向至 os_kill_commands.sh 并赋予执行权限
↓
自动调用并执行生成的清理脚本
↓
所有匹配条件的 JDBC 连接被强制终止