Oracle中如何查看正在运行的活动会话
Oracle中如何查看正在运行的活动会话?这5种方法够用了
今天咱们聊点实际工作中常遇到的问题——当你突然发现Oracle数据库变慢了,老板端着咖啡杯在你工位附近转悠时,该怎么快速揪出那些正在吃资源的会话?别慌,我这就把压箱底的查询技巧都掏出来。
一、用系统视图直接查会话
打开SQLPlus就像打开自家冰箱一样顺手,先来段最基础的查询:
- 查看所有活动会话:
SELECT sid, serial, username, program, status
FROM v$session
WHERE status = 'ACTIVE';
记得上个月老张就是因为漏看了serial字段,误杀了重要会话,结果被财务部的姐姐们追着打了三天。咱们可不能犯这种低级错误。
1.1 会话详情进阶查法
要查具体执行的SQL内容,得用这个组合拳:
SELECT s.sid, s.sql_id, sq.sql_text
FROM v$session s
JOIN v$sql sq ON s.sql_id = sq.sql_id
WHERE s.status = 'ACTIVE';
二、动态性能视图组合查询
有时候光看会话还不够,得结合多个视图来看全貌。就像炒菜要掌握火候,这里咱们得掌握字段间的关联关系。
视图名称 | 关键字段 | 适用场景 |
---|---|---|
v$session | sid, serial | 基础会话信息 |
v$sql | sql_id, sql_text | 查看具体SQL内容 |
v$session_wait | event, wait_time | 分析会话等待事件 |
三、图形化工具更直观
新手推荐用SQL Developer的监控功能,就像给数据库装了行车记录仪:
- 连接数据库后右键点击"监控会话"
- 在过滤条件里勾选"活动会话"
- 双击可疑会话查看执行计划
上周我用这个方法逮着个没带where条件的全表更新,愣是把查询时间从2分钟压到了5秒,老板看我的眼神都慈祥了不少。
四、自动监控脚本配置
老鸟们都在用的自动监控方案,设置好了能少加很多班:
BEGIN
DBMS_SCHEDULER.create_job(
job_name => 'MONITOR_ACTIVE_SESSIONS',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
INSERT INTO session_history
SELECT FROM v$session
WHERE status="ACTIVE";
END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY;INTERVAL=5',
enabled => TRUE);
END;
配上这个脚本,就算下班回家陪孩子搭积木的时候,手机收到监控告警也能及时处理,再也不用大半夜被叫起来救火了。
五、历史会话分析技巧
有时候问题会话就像夏天的阵雨,等你去查的时候早就消失了。这时候就得用时光机:
SELECT sample_time, session_id, sql_id
FROM dba_hist_active_sess_history
WHERE session_state = 'ON CPU'
AND sample_time BETWEEN SYSDATE-1/24 AND SYSDATE;
上次用这个查出凌晨三点有个自动任务在疯狂跑报表,调整调度时间后,早高峰的业务再也不卡了,前台小妹还给我带了半个月的早餐。
方法 | 实时性 | 信息量 | 使用难度 |
---|---|---|---|
v$session查询 | 实时 | 基础信息 | 简单 |
ASH报告 | 历史数据 | 详细记录 | 中等 |
窗外的天色渐暗,显示器上的SQL窗口还开着。看着刚刚跑出来的监控数据,顺手把可疑会话的SPID记在小黄签上,明天一早就去找系统部同事查服务器进程。保存好查询脚本,关掉电脑前顺手给老板发了条微信:"活动会话监控方案已部署,异常情况随时可查。"
评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
网友留言(0)