You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境:用「任务计划程序」

  1. 打开「任务计划程序」→ 创建基本任务
  2. 命名任务(比如“Oracle监控任务”),设置触发频率(比如每5分钟执行一次)
  3. 操作选择「启动程序」,选中你的批处理脚本
  4. 勾选「不管用户是否登录都要运行」,确保后台持续执行

Linux环境:用Crontab

  1. 编辑定时任务:crontab -e
  2. 添加一行规则(比如每5分钟执行一次脚本):
    */5 * * * * /home/user/scripts/db_monitor.sh
    
  3. 保存退出,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>

五、额外优化建议

  1. 脚本里加错误处理:比如sqlplus连接失败时,把具体错误信息写入日志,方便排查问题
  2. 日志归档:定期压缩旧日志文件,避免占用过多磁盘空间
  3. 网站安全:如果是公网访问,给Flask加身份验证(比如用Flask-Login),防止未授权访问
  4. 生产环境进阶:如果需要更专业的监控,也可以考虑用Prometheus + Grafana,但上面的方案完全能满足自定义需求

内容的提问来源于stack exchange,提问作者sherin shaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:21:01