如何快速诊断Oracle性能问题?

一、性能类故障标准处理思路

核心原则:先宏观 → 再微观 → 抓现场数据 → 定位根因

  1. 先了解全局背景(不登录数据库也能做)
    主机配置:CPU、内存、磁盘、网卡规格
    业务架构:应用 → 中间件 → 数据库拓扑
    近期变更:发布、扩容、流量突增、数据量暴涨、配置修改
  2. 检查主机操作系统资源
    使用 Linux 命令排查CPU/IO/ 内存瓶颈:
    bash
    运行

1. 看CPU、进程负载

top

2. 看CPU上下文切换、运行队列、swap

vmstat 1 10

3. 看磁盘IO瓶颈(最常见性能根因)

iostat -x 1 10

4. 看内存使用

free -h

重点观察 3 个指标:

CPU:运行队列长、% us、% sy 高

IO:% util 接近 100%、await 高、IO 等待严重

内存:swap 频繁交换(性能杀手)

找到耗资源的进程 PID 后,用oradebug 跟踪 SQL:

-- 绑定操作系统进程PID

sql 复制代码
oradebug setospid xxx;
oradebug unlimit;

-- 开启10046 trace(level 12 包含绑定变量+等待事件)

sql 复制代码
oradebug event 10046 trace name context forever, level 12;

-- 关闭trace

sql 复制代码
oradebug event 10046 trace name context off;
  1. 登录数据库,检查会话排队
    核心判断:活动会话数远高于平时 = 性能拥堵

-- 查看当前活动会话

sql 复制代码
select count(*) from v$session where status='ACTIVE' and username is not null;
  1. 查等待事件(最核心诊断视图)

-- 查看当前实时等待事件(性能问题根因90%在这里)

sql 复制代码
select event, count(*) 
from v$session_wait 
where wait_time=0 
group by event 
order by 2 desc;

V$SESSION_WAIT 是 Oracle 性能故障第一现场视图。

  1. 采集性能报告(保留现场证据)

表格

版本 推荐报告

Oracle 9i Statspack(6 级,采样 10 分钟)

Oracle 10g+ AWR 报告 + ASH 报告(10 分钟最佳)

AWR/ASH 优势:未被时间平均,真实反映故障瞬间性能。

  1. 排查外部组件

中间件连接池耗尽

网络延迟、丢包

存储性能瓶颈

二、快速定位资源持有者(锁 / 闩锁 / Mutex 争用)

Oracle 三大资源保护机制:LOCK、LATCH、MUTEX

性能故障本质 = 资源争用 + 等待持有者释放

下面是直接可复制执行的定位脚本:

  1. 定位 LOCK 持有者(表锁、行锁争用)

-- 查出阻塞别人的锁持有者

sql 复制代码
select * from gv$lock where block=1;

-- 查看等待者与持有者对应关系

sql 复制代码
select * from dba_waiters;
  1. 定位 LATCH 持有者
sql 复制代码
select * from v$latchholder;
  1. 定位 MUTEX 持有者(高并发最常见)
    典型等待事件:cursor: pin S wait on X

-- 查 MUTEX 持有者 SID

sql 复制代码
select to_number(substr(to_char(rawtohex(p2raw)),1,8),'XXXXXXXX') sid
from v$session
where event = 'cursor: pin S wait on X';
  1. 定位 Library Cache Lock 持有者
sql 复制代码
select b.sid,a.user_name,a.kglnaobj
from x$kgllk a , v$session b
where a.kgllkhdl in
(select p1raw from v$session_wait
where wait_time=0 and event = 'library cache lock')
and a.kgllkmod <> 0
and b.saddr=a.kgllkuse;
  1. 定位 Library Cache Pin 持有者
sql 复制代码
select sid from x$kglpn , v$session
where KGLPNHDL in
(select p1raw from v$session_wait
where wait_time=0 and event like 'library cache pin%')
and KGLPNMOD <> 0
and v$session.saddr=x$kglpn.kglpnuse;
  1. 定位 Row Cache 持有者
sql 复制代码
select * from v$rowcache_parent where lock_mode<>0;

总结

性能故障处理流程:全局背景 → OS 资源 → 数据库会话 → 等待事件 → 性能报告 → 外部组件

核心视图:v$session_wait(第一现场)

争用根因定位:用脚本快速找到 LOCK/LATCH/MUTEX 持有者

关键动作:故障时必须采集 AWR/ASH,这是定位根因的核心依据

相关推荐
小书房2 小时前
KMP跨平台之数据库
数据库·kmp
2401_894915532 小时前
GEO 定位优化源码搭建常见报错排查:数据库、伪静态、接口调试
java·数据库·网络协议·tcp/ip·spring·unity
奇树谦2 小时前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第三篇:LMDB 深度解析二
数据库·oracle·lsm-tree
提笔了无痕2 小时前
Agent 上下文管理详解、Context设计与构建
数据库·oracle·agent·context
用户7152287381413 小时前
数据库字段冗余,真的只是用空间换时间吗?
数据库
沉下去,苦磨练!3 小时前
Human‑in‑the‑Loop
数据库·oracle
吠品3 小时前
Java中实现拓扑排序的两种方式:Kahn算法和DFS
java·数据库·notepad++
轻揉小乔 真新人3 小时前
数据库架构的升级和变更
数据库·数据库架构
禁默3 小时前
信创实战:Python + SQLAlchemy 接入金仓数据库(从驱动安装到完整 CRUD)
开发语言·数据库·python
范什么特西3 小时前
知识总结04(redis)
数据库·redis·缓存