Oracle数据库连通性测试批处理与监控网站开发技术咨询
Oracle数据库监控与可视化展示完整实现方案
我来帮你拆解这个需求,分成几个核心部分一步步实现,每个环节都给你具体的方案和技术推荐:
一、编写批处理/Shell脚本,完成连通性与可用性测试
不管你用Windows还是Linux服务器,核心是用Oracle自带的sqlplus工具验证数据库连通,用系统命令检查服务器状态。
Windows批处理脚本示例
@echo off setlocal enabledelayedexpansion :: === 配置参数,记得改成你的实际信息 === set ORACLE_USER=your_db_user set ORACLE_PWD=your_db_password set ORACLE_DSN=//db_server_ip:1521/your_service_name set LOG_FILE=D:\db_monitor\logs\db_test.log set MONITOR_TABLE=DB_MONITOR_LOGS :: 存到数据库的表名,需提前创建 :: 获取当前时间,格式统一为YYYY-MM-DD HH:MM for /f "tokens=1-4 delims=/ " %%i in ('date /t') do set CURRENT_DATE=%%k-%%j-%%i for /f "tokens=1-2 delims=: " %%i in ('time /t') do set CURRENT_TIME=%%i:%%j set TIMESTAMP=!CURRENT_DATE! !CURRENT_TIME! :: 测试服务器可用性(ping一次目标服务器) ping -n 1 db_server_ip >nul if !errorlevel! equ 0 ( set SERVER_STATUS=UP ) else ( set SERVER_STATUS=DOWN ) :: 测试Oracle数据库连通性(用sqlplus执行exit命令,判断返回码) echo exit | sqlplus -s %ORACLE_USER%/%ORACLE_PWD%@%ORACLE_DSN% >nul if !errorlevel! equ 0 ( set DB_STATUS=UP ) else ( set DB_STATUS=DOWN ) :: 写入本地日志文件 echo [!TIMESTAMP!] 服务器状态: !SERVER_STATUS!, 数据库状态: !DB_STATUS! >> %LOG_FILE% :: 写入Oracle数据库(可选,需先创建监控表) if !DB_STATUS! equ UP ( echo INSERT INTO %MONITOR_TABLE% (TIMESTAMP, SERVER_STATUS, DB_STATUS) VALUES (TO_DATE('!TIMESTAMP!', 'YYYY-MM-DD HH24:MI'), '!SERVER_STATUS!', '!DB_STATUS!'); | sqlplus -s %ORACLE_USER%/%ORACLE_PWD%@%ORACLE_DSN% >nul )
提前准备数据库监控表
如果要把结果写入Oracle,先在数据库里建一张表:
CREATE TABLE DB_MONITOR_LOGS ( ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, TIMESTAMP DATE NOT NULL, SERVER_STATUS VARCHAR2(10) NOT NULL, DB_STATUS VARCHAR2(10) NOT NULL );
Linux环境替换方案
把上面的批处理改成Shell脚本,逻辑完全一致,只是时间获取和命令细节调整,比如用date "+%Y-%m-%d %H:%M"获取时间,ping -c 1 db_server_ip测试连通。
二、设置定时任务,让脚本自动执行
Windows环境:用「任务计划程序」
- 打开「任务计划程序」→ 创建基本任务
- 命名任务(比如“Oracle监控任务”),设置触发频率(比如每5分钟执行一次)
- 操作选择「启动程序」,选中你的批处理脚本
- 勾选「不管用户是否登录都要运行」,确保后台持续执行
Linux环境:用Crontab
- 编辑定时任务:
crontab -e - 添加一行规则(比如每5分钟执行一次脚本):
*/5 * * * * /home/user/scripts/db_monitor.sh - 保存退出,Crontab会自动生效,无需重启服务
三、数据存储选择:日志文件 vs 数据库
- 日志文件:优点是简单易实现,不需要额外配置;缺点是统计uptime/downtime时要手动分析日志,适合小范围测试
- 数据库存储:推荐用于长期监控!后续统计时长、做可视化都非常方便,直接用SQL就能计算出各种指标
四、搭建监控展示网站
推荐一套轻量易上手的技术栈,快速实现可视化:
技术栈推荐
- 后端:Python Flask(轻量快速,适合小项目,连接Oracle也很方便)
- 前端:HTML/CSS + JavaScript + ECharts(免费开源的可视化库,做饼图、折线图超简单)
后端核心代码示例(Flask)
from flask import Flask, jsonify import cx_Oracle from datetime import timedelta app = Flask(__name__) # Oracle数据库连接配置 DB_CONFIG = { "user": "your_db_user", "password": "your_db_password", "dsn": "db_server_ip:1521/your_service_name" } @app.route("/api/monitor-stats") def get_monitor_stats(): conn = cx_Oracle.connect(**DB_CONFIG) cursor = conn.cursor() # 计算总监控时长(从第一条日志到最后一条的时间差) cursor.execute("SELECT MIN(TIMESTAMP), MAX(TIMESTAMP) FROM DB_MONITOR_LOGS") min_time, max_time = cursor.fetchone() total_hours = (max_time - min_time).total_seconds() / 3600 # 计算数据库UP的总时长(用LEAD函数获取下一条日志的时间,计算每条UP记录的持续时间) cursor.execute(""" SELECT SUM( (LEAD(TIMESTAMP) OVER (ORDER BY TIMESTAMP) - TIMESTAMP) ) FROM DB_MONITOR_LOGS WHERE DB_STATUS = 'UP' """) uptime_interval = cursor.fetchone()[0] uptime_hours = uptime_interval.total_seconds() / 3600 if uptime_interval else 0 # 计算停机时长和可用率 downtime_hours = round(total_hours - uptime_hours, 2) uptime_percent = round((uptime_hours / total_hours) * 100, 2) stats = { "total_monitor_hours": round(total_hours, 2), "uptime_hours": round(uptime_hours, 2), "downtime_hours": downtime_hours, "uptime_percent": uptime_percent } cursor.close() conn.close() return jsonify(stats) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=False)
前端可视化示例(ECharts饼图)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Oracle监控仪表盘</title> <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script> <style> .dashboard { width: 800px; margin: 50px auto; } </style> </head> <body> <div class="dashboard"> <h1>Oracle数据库运行状态统计</h1> <div id="pie-chart" style="width: 100%; height: 400px;"></div> <div id="stats" style="margin-top: 20px; font-size: 18px;"></div> </div> <script> // 从后端接口获取统计数据 fetch("/api/monitor-stats") .then(res => res.json()) .then(data => { // 渲染统计文本 document.getElementById("stats").innerHTML = ` <p>总监控时长: ${data.total_monitor_hours} 小时</p> <p>数据库可用时长: ${data.uptime_hours} 小时</p> <p>数据库停机时长: ${data.downtime_hours} 小时</p> <p>可用率: ${data.uptime_percent}%</p> `; // 渲染饼图 const chart = echarts.init(document.getElementById("pie-chart")); const option = { title: { text: "可用时长vs停机时长占比" }, tooltip: { trigger: "item", formatter: "{b}: {c}小时 ({d}%)" }, series: [{ name: "时长统计", type: "pie", radius: "50%", data: [ { value: data.uptime_hours, name: "可用时长" }, { value: data.downtime_hours, name: "停机时长" } ], color: ["#5470c6", "#f08080"] }] }; chart.setOption(option); }); </script> </body> </html>
五、额外优化建议
- 脚本里加错误处理:比如sqlplus连接失败时,把具体错误信息写入日志,方便排查问题
- 日志归档:定期压缩旧日志文件,避免占用过多磁盘空间
- 网站安全:如果是公网访问,给Flask加身份验证(比如用Flask-Login),防止未授权访问
- 生产环境进阶:如果需要更专业的监控,也可以考虑用Prometheus + Grafana,但上面的方案完全能满足自定义需求
内容的提问来源于stack exchange,提问作者sherin shaf
相关产品推荐
相关产品推荐

