🚀 2.1 Oracle数据库负载情况检查
检查 Oracle 数据库负载情况是 DBA 日常运维的核心工作,旨在评估系统资源使用、识别性能瓶颈、预防故障。下面从操作系统和数据库两个层面,给出常用的检查方法、命令和解读要点。
一、操作系统层面负载
1. CPU 使用率
top # 实时查看 CPU 占用(按 1 查看每个核心)
mpstat -P ALL 1 5 # 每个核心的 CPU 使用率,重点关注 %user、%system、%iowait
sar -u 1 5 # 系统级 CPU 使用率历史(需安装 sysstat)
- 期望值:%user + %system < 70%,%iowait < 10%。
- 异常:%user 高表示应用密集,%system 高可能为系统调用或上下文切换过多,%iowait 高提示磁盘瓶颈。
2. 内存使用
free -h # 内存总量、已用、可用
vmstat 1 5 # 查看 swpd、free、si/so(交换)
- 期望值:
available内存充足,si/so 几乎为 0。 - 异常:大量 swap 使用(si/so > 0)表示内存不足,需调整 SGA/PGA 或增加物理内存。
3. 磁盘 I/O
iostat -x 1 5 # 查看 %util、await、r/s、w/s
- 期望值:%util < 80%,await < 20ms(SSD 可更低)。
- 异常:%util 长期 > 80%,await 过高,说明磁盘 I/O 瓶颈。
4. 系统负载(Load Average)
uptime # 显示 1、5、15 分钟平均负载
- 解读:负载值应小于 CPU 核心数,否则可能存在排队。
5. 网络
netstat -i # 查看网络接口丢包、错误
ifstat # 实时网络流量(需安装)
- 关注点:丢包率、带宽使用是否接近上限。
二、数据库层面负载
1. 当前会话与活跃会话数
-- 总连接数
SELECT COUNT(*) FROM v$session;
-- 活跃会话(正在等待 CPU 或 I/O,非空闲)
SELECT COUNT(*) FROM v$session WHERE status = 'ACTIVE' AND type != 'BACKGROUND';
-- 按等待分类统计活跃会话
SELECT event, COUNT(*) FROM v$session WHERE status = 'ACTIVE' GROUP BY event ORDER BY COUNT(*) DESC;
- 正常值:活跃会话数应远小于连接池上限,若长期接近
processes参数需扩容。
2. 等待事件(Top Wait Events)
-- 当前等待事件
SELECT event, wait_class, state, wait_time_micro, seconds_in_wait
FROM v$session
WHERE status = 'ACTIVE'
ORDER BY seconds_in_wait DESC;
-- 数据库累计等待事件(自实例启动)
SELECT event, total_waits, time_waited_micro/1000000 wait_sec, average_wait
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited_micro DESC
FETCH FIRST 10 ROWS ONLY;
-
常见高影响等待:
db file sequential/scattered read→ I/O 问题或 SQL 低效。log file sync→ 提交频繁或 I/O 慢。buffer busy waits→ 热块争用。enq: TX - row lock contention→ 行锁等待,应用串行问题。
3. 当前消耗资源最多的 SQL
-- 按 CPU 时间排序(需有 DBA_HIST_SQLSTAT 或 v$sqlstats)
SELECT sql_id, sql_text, cpu_time/1000000 cpu_sec, elapsed_time/1000000 elapsed_sec, executions
FROM v$sqlstats
WHERE cpu_time > 1000000
ORDER BY cpu_time DESC
FETCH FIRST 10 ROWS ONLY;
-- 按逻辑读排序
SELECT sql_id, sql_text, buffer_gets, executions, buffer_gets/executions per_exec
FROM v$sqlstats
WHERE executions > 0
ORDER BY buffer_gets DESC
FETCH FIRST 10 ROWS ONLY;
-- 实时查看当前正在执行的 SQL(需 v$session + v$sql)
SELECT s.sid, s.serial#, s.username, s.sql_id, sq.sql_text, s.event, s.wait_time_micro
FROM v$session s, v$sql sq
WHERE s.sql_id = sq.sql_id(+) AND s.status = 'ACTIVE' AND s.type != 'BACKGROUND';
4. 数据库吞吐量与响应时间
-- 每秒事务数(近似)
SELECT value FROM v$sysmetric WHERE metric_name = 'User Transaction Per Sec' AND group_id=2;
-- 每秒逻辑读
SELECT value FROM v$sysmetric WHERE metric_name = 'Logical Reads Per Sec' AND group_id=2;
-- 平均活跃会话(AAS)
SELECT value FROM v$sysmetric WHERE metric_name = 'Average Active Sessions' AND group_id=2;
这些指标可通过 v$sysmetric 获取最近 60 秒的采样。
5. 锁与阻塞
-- 查看阻塞关系
SELECT blocking_session, session_id, wait_class, seconds_in_wait
FROM v$session
WHERE blocking_session IS NOT NULL;
-- 更详细:阻塞树
SELECT LEVEL, sid, serial#, username, event, blocking_session, wait_class
FROM v$session
WHERE blocking_session IS NOT NULL OR sid IN (SELECT blocking_session FROM v$session WHERE blocking_session IS NOT NULL)
CONNECT BY PRIOR sid = blocking_session
START WITH blocking_session IS NULL;
6. AWR/ASH 报告(历史负载分析)
-- 生成 AWR 报告(指定快照范围)
@?/rdbms/admin/awrrpt.sql
-- 查询最近 ASH 活动
SELECT sample_time, session_id, sql_id, event, wait_class
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/24 -- 最近 1 小时
ORDER BY sample_time;
三、常用负载检查脚本(SQL*Plus)
将以下脚本保存为 check_load.sql,执行 @check_load 可快速查看关键负载指标:
12c以上版本
set pages 100 lines 200
col event for a40
col sql_text for a60
prompt === 1. 活跃会话数 ===
select count(*) active_sessions from v$session where status='ACTIVE' and type!='BACKGROUND';
prompt === 2. Top 5 等待事件(累计) ===
select event, total_waits, round(time_waited_micro/1000000,2) wait_sec
from v$system_event
where wait_class != 'Idle'
order by time_waited_micro desc
fetch first 5 rows only;
prompt === 3. 当前阻塞情况 ===
select blocking_session, sid, username, event, seconds_in_wait
from v$session
where blocking_session is not null;
prompt === 4. 当前 Top CPU 消耗 SQL(v$sqlstats) ===
select sql_id, substr(sql_text,1,60) sql_text, cpu_time/1000000 cpu_sec, executions
from v$sqlstats
where cpu_time > 1000000
order by cpu_time desc
fetch first 5 rows only;
prompt === 5. 最近 1 小时 ASH 中 Top 等待事件 ===
select event, count(*) from v$active_session_history
where sample_time > sysdate - 1/24
group by event
order by count(*) desc
fetch first 5 rows only;
11G版本
set pages 100 lines 200
col event for a40
col sql_text for a60
prompt === 1. 活跃会话数 ===
select count(*) active_sessions from v$session where status='ACTIVE' and type!='BACKGROUND';
prompt === 2. Top 5 等待事件(累计) ===
select event, total_waits, round(time_waited_micro/1000000,2) wait_sec
from (
select event, total_waits, time_waited_micro
from v$system_event
where wait_class != 'Idle'
order by time_waited_micro desc
)
where rownum <= 5;
prompt === 3. 当前阻塞情况 ===
select blocking_session, sid, username, event, seconds_in_wait
from v$session
where blocking_session is not null;
prompt === 4. 当前 Top CPU 消耗 SQL(v$sql) ===
select sql_id, substr(sql_text,1,60) sql_text, cpu_time/1000000 cpu_sec, executions
from (
select sql_id, sql_text, cpu_time, executions
from v$sql
where cpu_time > 1000000
order by cpu_time desc
)
where rownum <= 5;
prompt === 5. 最近 1 小时 ASH 中 Top 等待事件 ===
select event, cnt
from (
select event, count(*) cnt
from v$active_session_history
where sample_time > sysdate - 1/24
group by event
order by count(*) desc
)
where rownum <= 5;
四、负载检查总结与建议
| 检查项 | 正常指标 | 异常表现 | 常见对策 |
|---|---|---|---|
| CPU 使用率 | <70% | 持续 >80% | 优化 SQL、增加 CPU、调整并行度 |
| 内存 | 无 swap 使用 | si/so >0 | 调整 SGA/PGA,减少物理内存压力 |
| 磁盘 I/O | %util<80%, await<20ms | 高 iowait,await>50ms | 分散 I/O、使用 SSD、优化 SQL |
| 活跃会话数 | 小于连接池上限 | 接近 processes 限制 | 增加 processes,排查阻塞 SQL |
| 等待事件 | 无显著等待 | log file sync 高 | 调整提交频率,改善日志 I/O |
| 高消耗 SQL | 单次执行资源合理 | 频繁全表扫描,逻辑读高 | 添加索引,优化 SQL |
| 锁阻塞 | 短暂出现 | 长时间阻塞 | 分析阻塞源,优化应用事务 |
建议将负载检查纳入日常巡检,结合 AWR 报告 进行周期分析。若发现持续高负载,应及时定位根因(如 SQL 问题、配置不足、硬件瓶颈)并采取对应优化措施。
阅读:155
发布时间: