Debian下Oracle监控实现指南
一、监控目标与总体架构
二、快速检查与命令行监控
lsnrctl statustail -f $ORACLE_HOME/network/log/listener.logss -tuln | grep 1521 或 nmap -p 1521 localhostps -ef | grep ora_top/htop、vmstat、iostat、nmonselect 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 (+);
三、自动化脚本与系统服务
/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-listenerjournalctl -u oracle-listener -fcrontab -e 添加:0 * * * * /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl status > /var/log/oracle-listener-status.log 2>&1#!/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
四、企业级监控方案与落地
lsnrctl status 异常、listener.log 出现致命错误。smon/pmon 进程缺失、归档/联机日志切换异常、系统表空间使用率超过85%。