Debian下Oracle性能监控实操指南
一 监控体系与工具选型
二 数据库层关键SQL与检查
SELECT s.inst_id||':'||s.sid AS inst_sid,
s.username,
(SYSDATE - s.sql_exec_start) DAY TO SECOND AS exec_dur,
s.sql_id,
SUBSTR(q.sql_text,1,60) AS sql_text,
CASE WHEN s.wait_time_micro = 0 THEN
CASE s.wait_class WHEN 'Idle' THEN 'IDLE: '||s.event ELSE s.event END
ELSE 'ON CPU' END AS state,
ROUND(CASE WHEN s.wait_time_micro = 0 THEN s.time_since_last_wait_micro
ELSE s.wait_time_micro END / 1e6, 2) AS wait_sec
FROM gv$session s
LEFT JOIN gv$sql q ON q.sql_id = s.sql_id AND q.inst_id = s.inst_id
WHERE s.status = 'ACTIVE'
AND s.username IS NOT NULL
ORDER BY wait_sec DESC NULLS LAST
FETCH FIRST 20 ROWS ONLY;
SELECT sql_id, sql_text,
ROUND(elapsed_time/1e6, 2) AS elapsed_sec,
executions
FROM v$sql
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SELECT a.tablespace_name,
ROUND(a.bytes/1024/1024, 2) AS total_mb,
ROUND((a.bytes - b.bytes)/1024/1024, 2) AS used_mb,
ROUND((a.bytes - b.bytes)/a.bytes*100, 2) AS used_pct
FROM (SELECT tablespace_name, SUM(bytes) AS bytes
FROM dba_data_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) AS bytes
FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY used_pct DESC;
-- 查看快照范围
SELECT snap_id, begin_interval_time, end_interval_time
FROM dba_hist_snapshot ORDER BY snap_id DESC;
-- 生成AWR报告(在SQL*Plus中执行,按提示选择开始/结束快照ID)
@?/rdbms/admin/awrrpt.sql
说明:AWR/ASH 为 Oracle 内置性能诊断数据,适合定位 Top SQL、等待事件、负载变化 等性能问题。三 系统层与监听器的监控
top/htop # 进程与CPU/内存
vmstat 1 # 虚拟内存、CPU、I/O
iostat -x 1 # 磁盘I/O与await、svctm
sar 1 # 系统活动历史/实时
nmon # 综合资源监控
dstat # 多合一资源视图
free -h # 内存使用
df -h # 磁盘空间
netstat -tlnp | grep 1521 # 监听端口连通性
lsnrctl status # 查看服务/客户端连接概况
lsnrctl reload # 重载配置(不中断现有连接)
tail -f $ORACLE_HOME/network/log/listener.log
lsnrctl trace start # 开启跟踪(排障用)
lsnrctl trace stop # 关闭跟踪
要点:lsnrctl 用于监听器的管理与状态查看,并非系统性能监控工具;系统层应配合 top/vmstat/iostat 等使用。四 自动化与告警落地
#!/usr/bin/env bash
ORACLE_SID=your_sid
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID ORACLE_HOME PATH
THRESHOLD=80
ALERT_EMAIL=dba@example.com
sqlplus -S / as sysdba <<'EOF'
SET HEADING OFF FEEDBACK OFF
SELECT tablespace_name || ':' || ROUND(used_pct, 1)
FROM (
SELECT a.tablespace_name,
ROUND((a.bytes - b.bytes)/a.bytes*100, 1) AS used_pct
FROM (SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_data_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
)
WHERE used_pct > $THRESHOLD
/
EXIT
EOF
建议:将脚本输出接入 Zabbix Agent 的 UserParameter 或 Nagios 插件,并设置 告警升级 与 值班通知。五 日常巡检清单与阈值建议
| 维度 | 关键指标 | 建议阈值或动作 |
|---|---|---|
| 表空间 | 使用率 | 超过 80% 预警,超过 90% 尽快扩容或清理 |
| 活跃会话 | 会话数、阻塞 | 突增或长期阻塞需排查 Top SQL 与锁等待 |
| 长时SQL | Elapsed Time、Executions | 结合 AWR/ASH 优化执行计划与索引 |
| 等待事件 | DB CPU、IO、锁 | 关注 db file sequential/scattered read、log file sync 等 |
| 监听器 | 状态、连接排队 | 使用 lsnrctl status 观察服务注册与连接数 |
| 系统资源 | CPU、内存、I/O | CPU 持续 > 80%、I/O await 高、内存紧张时联动排查 |
| Data Guard | 备库应用延迟 | 备库 LAST_APPLIED_TIME 落后超过阈值(如 1–3 小时)告警 |
| 日志 | Alert/Listener | 关键字 ORA-、TNS 错误、频繁重连及时告警 |