在Debian系统上监控Oracle数据库运行状态,通常需要依赖于Oracle提供的工具和方法。由于Debian系统本身并不自带Oracle数据库的监控工具,因此以下方法主要适用于已经安装了Oracle数据库软件的Debian系统。具体方法如下:
lsnrctl:
lsnrctl status
lsnrctl logfile
lsnrctl monitor
lsnrctl reload
lsnrctl stop
lsnrctl start
系统监控工具:
sudo apt-get updatesudo apt-get install nmon
sudo nmon -c 10 # 持续监控10秒
sudo systemctl status lsnrctl
日志监控: 检查服务的日志文件是监控服务状态的重要手段,通常服务的日志文件位于 /var/log/ 目录下。
sudo tail -f /var/log/lsnrctl.log
第三方监控工具:
可以使用SQL查询来监控Oracle中正在运行的SQL语句。例如,以下脚本可以查询正在运行的SQL语句及其相关信息:
select ses.inst_id||chr(58)||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 time_since_last_wait_microwhen 0 then (case wait_class when 'Idle' then 'IDLE: '||event else event end)else 'ON CPU'end,1,33) event,
(case time_since_last_wait_microwhen 0 then wait_time_microelse time_since_last_wait_microend) /1000000 wait_sec
from gv$session ses,
gv$sqlstats sql
where ses.inst_id||chr(58)||ses.sid <> sys_context ('USERENV','INSTANCE')||chr(58)||sys_context ('USERENV','SID')
and username is not null
and status='ACTIVE'
and ses.sql_id=sql.sql_id (+);
可以使用专门的监控脚本来监控Oracle数据库的状态。例如,以下是一个监控Oracle ADG状态的脚本示例:
#!/bin/bash
export ORACLE_SID=orclexport ORACLE_HOME=/u01/app/oracle/product/11.2.0/db
export PATH=$ORACLE_HOME/bin:$PATH
# Oracle 用户和密码
# 如果监控脚本布置在adg本机 可以不设置DB_USER="sys"DB_PASS="password"TNS_ADMIN="orcl"
# TNS Entry for standby database
# 邮件设置MAIL_TO="xiaoxiangqin@mail.com"SUBJECT="ADG Status Alert"MAIL_LOG="/tmp/adg_alert_mail.log"
# 查询数据库,获取最后应用的日志时间
LAST_APPLIED_TIME=$(sqlplus -s "$DB_USER/$DB_PASS as sysdba" <<EOFSET
HEADING OFFSET 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: Unable to retrieve last applied log time." >> $MAIL_LOG
exit 1
fi
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
CURRENT_TIMESTAMP=$(date -d "$CURRENT_TIME" +%s)
TIME_DIFF=$((CURRENT_TIMESTAMP - LAST_APPLIED_TIMESTAMP))
# 时间差是否超过 1 小时(3600 秒)
#这个时间和数据库的负载相关,如果是比较繁忙的系统,可以设置短一些
if [[ "$TIME_DIFF" -gt 3600]];then
echo "[$(date)] Last Applied Log Time: $LAST_APPLIED_TIME" >> $MAIL_LOG
echo "[$(date)] Current Time: $CURRENT_TIME" >> $MAIL_LOG
echo "[$(date)] Time difference exceeds 3 hours, sending alert." >> $MAIL_LOG
mailx -s "$SUBJECT" "$MAIL_TO" <<EOF
Warning: The last applied log on the ADG standby database was applied at $LAST_APPLIED_TIME.
Current time is $CURRENT_TIME.
The time difference exceeds 3 hours.
Please check the ADG status.
EOF
else
echo "[$(date)] ADG is normal." >> $MAIL_LOG
fi
通过上述方法,可以有效地监控Debian系统上的Oracle数据库,确保其稳定运行并及时发现潜在问题。