搜索结果

×

搜索结果将在这里显示。

🚀 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
发布时间: