Debian下Oracle监控如何实现
导读:Debian下Oracle监控实现指南 一、监控目标与总体架构 建议从四个层面建立可观测性: 监听器层:确认监听进程与端口(默认1521)可达、服务注册正常、日志无异常。 实例与数据库层:会话与SQL、等待事件、表空间、归档/Data...
Debian下Oracle监控实现指南
一、监控目标与总体架构
- 建议从四个层面建立可观测性:
- 监听器层:确认监听进程与端口(默认1521)可达、服务注册正常、日志无异常。
- 实例与数据库层:会话与SQL、等待事件、表空间、归档/Data Guard 延迟、AWR/ASH 基线。
- 操作系统层:CPU、内存、I/O、网络、进程资源(如 ora_pmon、ora_smon 等)。
- 告警与可视化:集中展示与阈值告警(如 Zabbix、Prometheus + oracle_exporter、Nagios、OEM)。
二、快速检查与命令行监控
- 监听器状态与端口
- 查看监听状态:
lsnrctl status - 实时查看监听日志:
tail -f $ORACLE_HOME/network/log/listener.log - 端口连通性:
ss -tuln | grep 1521或nmap -p 1521 localhost
- 查看监听状态:
- 数据库进程与资源
- 进程检查:
ps -ef | grep ora_ - 系统资源:
top/htop、vmstat、iostat、nmon
- 进程检查:
- 活跃会话与长SQL
- 示例查询(GV$ 视图适配 RAC/多实例):
select ses.inst_id||':'||ses.sid as inst_sid, username, (sysdate - sql_exec_start) day(1) to second(0) as sql_exec_start, ses.sql_id, substr(sql.sql_text,1,40) sql_text, substr(case when time_since_last_wait_micro=0 then case wait_class when 'Idle' then 'IDLE: '||event else event end else 'ON CPU' end,1,33) event, (case when time_since_last_wait_micro=0 then wait_time_micro else time_since_last_wait_micro end)/1000000 wait_sec from gv$session ses, gv$sqlstats sql where ses.inst_id||':'||ses.sid < > sys_context('USERENV','INSTANCE')||':'||sys_context('USERENV','SID') and username is not null and status='ACTIVE' and ses.sql_id = sql.sql_id (+);
- 示例查询(GV$ 视图适配 RAC/多实例):
- Data Guard 备库延迟(ADG)
- 获取最近已应用的归档时间并与当前时间比较,超过阈值(如1小时/3小时)触发告警。
三、自动化脚本与系统服务
- 使用 systemd 托管监听器
- 创建服务文件
/etc/systemd/system/oracle-listener.service:[Unit] Description=Oracle Database Listener After=network.target [Service] Type=forking User=oracle ExecStart=/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl start ExecStop=/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl stop ExecReload=/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl reload Restart=on-failure [Install] WantedBy=multi-user.target - 启用与启动:
systemctl daemon-reload & & systemctl enable --now oracle-listener - 日志查看:
journalctl -u oracle-listener -f
- 创建服务文件
- 定时巡检与告警
- 例:每小时记录监听状态到日志
crontab -e添加:0 * * * * /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl status > /var/log/oracle-listener-status.log 2> & 1
- ADG 延迟脚本(阈值可按负载调整):
#!/usr/bin/env bash export ORACLE_SID=orcl export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 export PATH=$ORACLE_HOME/bin:$PATH LAST_APPLIED_TIME=$(sqlplus -s / as sysdba < < 'EOF' SET HEADING OFF FEEDBACK OFF SELECT TO_CHAR(next_time, 'YYYY-MM-DD HH24:MI:SS') FROM v$archived_log WHERE sequence# = (SELECT MAX(sequence#) FROM v$archived_log WHERE applied='YES'); EXIT; EOF ) if [[ -z "$LAST_APPLIED_TIME" ]]; then echo "[$(date)] ERROR: Cannot get last applied time." > > /var/log/adg_monitor.log exit 1 fi CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S") CURRENT_TS=$(date -d "$CURRENT_TIME" +%s) LAST_TS=$(date -d "$LAST_APPLIED_TIME" +%s) DIFF=$((CURRENT_TS - LAST_TS)) if (( DIFF > 3600 )); then echo "[$(date)] WARN: Last applied $LAST_APPLIED_TIME, diff ${ DIFF} s" > > /var/log/adg_monitor.log # mailx -s "ADG Lag Alert" dba@example.com < < < "Last applied: $LAST_APPLIED_TIME, now: $CURRENT_TIME" else echo "[$(date)] OK: Last applied $LAST_APPLIED_TIME" > > /var/log/adg_monitor.log fi - 注意:将脚本中的 ORACLE_HOME、ORACLE_SID、告警方式 按实际环境调整。
- 例:每小时记录监听状态到日志
四、企业级监控方案与落地
- 常用平台与适配要点
- Oracle Enterprise Manager(OEM):图形化监控数据库、监听与主机,适合集中化运维与性能诊断。
- Zabbix:可通过 ODBC/External Check 采集数据库与监听指标,配置阈值与告警。
- Prometheus + oracle_exporter:拉取 Oracle 性能指标,配合 Grafana 可视化与 Alertmanager 告警。
- Nagios:以插件方式检查监听、会话、表空间等关键指标,适合传统监控体系。
- oratop:Oracle 官方轻量工具,实时查看进程、SQL、等待事件,适合临时排障与巡检。
- 建议的关键告警与阈值
- 监听器:端口 1521 不可达、
lsnrctl status异常、listener.log 出现致命错误。 - 实例:
smon/pmon进程缺失、归档/联机日志切换异常、系统表空间使用率超过85%。 - ADG:已应用日志时间滞后超过1小时(高负载可设为30分钟)。
- OS:CPU 持续> 80%、可用内存低于阈值、I/O 等待高、磁盘使用率> 85%。
- 监听器:端口 1521 不可达、
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Debian下Oracle监控如何实现
本文地址: https://pptw.com/jishu/753907.html
