分享一个Oracle 数据库信息收集脚本

news/2025/11/8 19:35:10/文章来源:https://www.cnblogs.com/liuziyi1/p/19202937

分享一个Oracle 数据库信息收集脚本

LINUX:

#!/bin/sh
##############################################################################
# 脚本名称:oracle_db_info_collector.sh
# 脚本版本:V3.0
# 功能描述:Oracle数据库信息收集工具,支持10g+版本,生成HTML格式巡检报告
##############################################################################set -euo pipefail# 定义全局变量
SCRIPT_NAME=$(basename "$0")
TEMP_DIR=$(mktemp -d /tmp/oracle_collect_XXXXXX)  # 临时目录
REPORT_SUFFIX="xifenfei_db_recover"
HTML_STYLE="
<style>body {font-family: Arial, sans-serif; margin: 20px; line-height: 1.6;}h1, h2, h3 {color: #2c3e50; border-bottom: 1px solid #ecf0f1; padding-bottom: 5px;}.section {margin: 20px 0; padding: 15px; background: #f8f9fa; border-radius: 5px;}.code-block {background: #2c3e50; color: #ecf0f1; padding: 10px; border-radius: 3px; overflow-x: auto;}
</style>
"# 清理临时目录(脚本退出时执行)
trap 'rm -rf "$TEMP_DIR" && echo "临时目录已清理:$TEMP_DIR"' EXIT##############################################################################
# 函数名:sql_exec
# 功能:执行SQL语句并返回结果(去除SQL>提示符和空行)
# 参数:$1 - 待执行的SQL语句
##############################################################################
sql_exec() {local sql_stmt="$1""$SQLPLUS" "/ as sysdba" <<EOF
set termout off echo off feedback off verify off wrap on trimspool on serveroutput on escape on
set pages 0 lines 200
$sql_stmt
exit;
EOF# 过滤无效输出grep -vE "SQL>|^$|^-" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
}##############################################################################
# 第一步:环境预检查
##############################################################################
echo "===== 开始环境预检查 ====="# 检查ORACLE_HOME
if [ -z "$ORACLE_HOME" ]; thenecho "ERROR: ORACLE_HOME环境变量未配置!" >&2exit 1
fi# 检查ORACLE_SID
if [ -z "$ORACLE_SID" ]; thenecho "ERROR: ORACLE_SID环境变量未配置!" >&2exit 1
fi# 检查实例是否运行(通过pmon进程)
PMON_PROCESSES=$(ps -ef | grep "ora_pmon_$ORACLE_SID" | grep -v grep)
if [ -z "$PMON_PROCESSES" ]; thenecho "ERROR: 实例[$ORACLE_SID]未运行,请先启动实例!" >&2exit 1
fi# 检查sqlplus可执行文件
SQLPLUS="$ORACLE_HOME/bin/sqlplus"
if [ ! -x "$SQLPLUS" ]; thenecho "ERROR: 未找到可执行的sqlplus(路径:$SQLPLUS)!" >&2exit 1
fi# 获取Oracle主版本号
ORACLE_VERSION=$(sqlplus -v | awk '{print $3}' | awk -F. '{print $1}')
echo "Oracle版本:$ORACLE_VERSION"# 检查数据库状态(需处于MOUNT/OPEN状态)
DB_STATUS=$(sql_exec "select status from v\$instance;")
if [ "$DB_STATUS" = "STARTED" ]; thenecho "ERROR: 数据库处于STARTED状态,请先挂载(mount)数据库!" >&2exit 1
fi
echo "数据库状态:$DB_STATUS"
echo "===== 环境预检查通过 ====="##############################################################################
# 第二步:生成报告文件名
##############################################################################
DB_NAME=$(sql_exec "select lower(name) from v\$database;")
REPORT_DATE=$(date +%Y%m%d)
REPORT_FILE="${REPORT_SUFFIX}_${DB_NAME}_${REPORT_DATE}.html"
echo "报告文件:$(pwd)/$REPORT_FILE"# 初始化HTML报告
cat > "$REPORT_FILE" <<EOF
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Oracle数据库信息收集报告 - $DB_NAME($REPORT_DATE)</title>$HTML_STYLE
</head>
<body><h1>Oracle数据库信息收集报告</h1><p>数据库名称:$DB_NAME</p><p>实例名称:$ORACLE_SID</p><p>Oracle版本:$ORACLE_VERSION</p><p>收集时间:$(date +"%Y-%m-%d %H:%M:%S")</p><div class="section"><h2>一、数据库基础信息</h2><div class="code-block">
EOF##############################################################################
# 第三步:收集数据库核心信息(按版本执行对应SQL脚本)
##############################################################################
echo "===== 开始收集数据库基础信息 ====="
if [ "$ORACLE_VERSION" -gt 11 ]; thenSQL_SCRIPT="check_recover_db_12c.sql"
elseSQL_SCRIPT="check_recover_db.sql"
fiif [ -f "$SQL_SCRIPT" ]; then"$SQLPLUS" "/ as sysdba" @("$SQL_SCRIPT") >> "$REPORT_FILE" 2>&1
elseecho "警告:未找到SQL脚本$SQL_SCRIPT,跳过基础信息收集!" >&2echo "<!-- 未找到SQL脚本$SQL_SCRIPT,基础信息收集跳过 -->" >> "$REPORT_FILE"
fi
echo "===== 数据库基础信息收集完成 ====="# 关闭基础信息代码块
echo "    </div></div>" >> "$REPORT_FILE"##############################################################################
# 第四步:收集补丁信息(OPatch)
##############################################################################
echo "===== 开始收集补丁信息 ====="
OPATCH="$ORACLE_HOME/OPatch/opatch"
cat >> "$REPORT_FILE" <<EOF<div class="section"><h2>二、补丁信息</h2><div class="code-block">
EOFif [ -x "$OPATCH" ]; then"$OPATCH" lsinventory >> "$REPORT_FILE" 2>&1
elseecho "警告:未找到OPatch工具(路径:$OPATCH),跳过补丁收集!" >&2echo "<!-- 未找到OPatch工具,补丁信息收集跳过 -->" >> "$REPORT_FILE"
fiecho "    </div></div>" >> "$REPORT_FILE"
echo "===== 补丁信息收集完成 ====="##############################################################################
# 第五步:收集告警日志(兼容10g/11g/12c+)
##############################################################################
echo "===== 开始收集告警日志 ====="
cat >> "$REPORT_FILE" <<EOF<div class="section"><h2>三、告警日志(最新1000行)</h2><div class="code-block">
EOF# 获取告警日志路径
if [ "$ORACLE_VERSION" -gt 10 ]; then# 11g+使用diagnostic_dest路径DIAGNOSTIC_DEST=$(sql_exec "select value from v\$parameter where name='diagnostic_dest';")DB_UNIQUE_NAME=$(sql_exec "select value from v\$parameter where name='db_unique_name';")ALERT_PATH="${DIAGNOSTIC_DEST}/diag/rdbms/${DB_UNIQUE_NAME}/${ORACLE_SID}/trace"
else# 10g使用background_dump_dest路径ALERT_PATH=$(sql_exec "select value from v\$parameter where name='background_dump_dest';")
fiALERT_LOG="${ALERT_PATH}/alert_${ORACLE_SID}.log"
echo "告警日志路径:$ALERT_LOG"if [ -f "$ALERT_LOG" ]; then# 截取最新1000行并写入报告tail -1000 "$ALERT_LOG" >> "$REPORT_FILE" 2>&1
elseecho "警告:未找到告警日志文件$ALERT_LOG,跳过告警日志收集!" >&2echo "<!-- 未找到告警日志文件$ALERT_LOG -->" >> "$REPORT_FILE"
fiecho "    </div></div>" >> "$REPORT_FILE"
echo "===== 告警日志收集完成 ====="##############################################################################
# 第六步:dbv校验系统数据文件(移除硬编码密码)
##############################################################################
echo "===== 开始执行系统数据文件校验 ====="
cat >> "$REPORT_FILE" <<EOF<div class="section"><h2>四、系统数据文件DBV校验结果</h2><div class="code-block">
EOF# 生成dbv执行命令(使用操作系统认证,无需硬编码密码)
DBV_COMMANDS=$(sql_exec "select 'dbv userid=/ file='||name||' blocksize='||BLOCK_SIZE||' logfile=${TEMP_DIR}/dbv_'||file#||'.log' from v\$datafile where ts#=0;")if [ -n "$DBV_COMMANDS" ]; thenecho "$DBV_COMMANDS" > "${TEMP_DIR}/dbv_exec.sh"chmod +x "${TEMP_DIR}/dbv_exec.sh"# 执行dbv校验"${TEMP_DIR}/dbv_exec.sh" >> "$REPORT_FILE" 2>&1# 合并校验日志cat "${TEMP_DIR}/dbv_"*.log >> "$REPORT_FILE" 2>&1
elseecho "警告:未查询到系统表空间数据文件,跳过DBV校验!" >&2echo "<!-- 未查询到系统表空间数据文件,DBV校验跳过 -->" >> "$REPORT_FILE"
fiecho "    </div></div>" >> "$REPORT_FILE"
echo "===== 系统数据文件校验完成 ====="##############################################################################
# 第七步:收集磁盘空间信息
##############################################################################
echo "===== 开始收集磁盘空间信息 ====="
cat >> "$REPORT_FILE" <<EOF<div class="section"><h2>五、磁盘空间状态</h2><div class="code-block">
EOF# df命令使用人类可读格式
df -h >> "$REPORT_FILE" 2>&1echo "    </div></div>" >> "$REPORT_FILE"
echo "===== 磁盘空间信息收集完成 ====="##############################################################################
# 第八步:完成报告生成
##############################################################################
cat >> "$REPORT_FILE" <<EOF
</body>
</html>
EOF# 输出报告路径提示
echo "===== 信息收集完成 ====="
echo "********************************************************************************"
echo "请查阅报告文件:$(pwd)/$REPORT_FILE"
echo "********************************************************************************"

二、WINDOWS:

@echo off
setlocal enabledelayedexpansion
cls:: 颜色配置(标题蓝、成功绿、错误红、提示白)
set "COLOR_TITLE=0b"   :: 亮蓝色
set "COLOR_SUCCESS=0a" :: 绿色
set "COLOR_ERROR=0c"   :: 红色
set "COLOR_INFO=07"    :: 白色:: 初始化变量
set "ORACLE_SID="
set "ORACLE_HOME="
set "SQLPLUS_PATH="
set "DB_VERSION="
set "SQL_SCRIPT="
set "REPORT_PATTERN=xifenfei*.html":: ==============================================
:: 第一步:脚本标题与环境说明
:: ==============================================
color %COLOR_TITLE%
echo.
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
echo          🌟  Oracle Database Recovery Check (Windows版)  🌟
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
echo 功能:自动校验环境、识别版本、执行恢复检查脚本、生成HTML报告
echo 支持版本:Oracle 10g/11g/12c/18c/19c/21c
echo 脚本依赖:check_recover_db.sql / check_recover_db_12c.sql(需与批处理同目录)
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
echo.
color %COLOR_INFO%:: ==============================================
:: 第二步:环境预检查(ORACLE_SID + ORACLE_HOME)
:: ==============================================
echo [🔍 环境预检查] 开始校验Oracle环境配置...
echo.:: 检查ORACLE_SID是否已配置
if not defined ORACLE_SID (echo ⚠️  未检测到ORACLE_SID环境变量,尝试自动获取已启动的Oracle服务...:: 从已启动的Oracle服务中提取SID(服务名格式:OracleService<SID>)for /f "tokens=2 delims=OracleService" %%s in ('wmic service where "name like 'OracleService%' and state='Running'" get name /value ^| findstr "OracleService"') do (set "AUTO_SID=%%s")if defined AUTO_SID (echo ✅ 自动获取到SID:!AUTO_SID!set "ORACLE_SID=!AUTO_SID!") else (color %COLOR_ERROR%echo ❌ 错误:未配置ORACLE_SID,且无运行中的Oracle服务!echo 请按以下步骤配置:echo 1. 计算机 → 管理 → 服务 → 找到OracleServiceXXXX(XXXX为你的SID)echo 2. 打开CMD,执行:set ORACLE_SID=XXXXecho 3. 执行:set ORACLE_HOME=你的Oracle安装目录(如D:\app\product\11.2.0\dbhome_1)echo 4. 执行:set PATH=!ORACLE_HOME!\bin;!PATH!echo 5. 重新运行本脚本echo.pause >nulexit /b 1)
) else (echo ✅ ORACLE_SID已配置:%ORACLE_SID%
):: 检查ORACLE_HOME是否已配置且有效
if not defined ORACLE_HOME (color %COLOR_ERROR%echo ❌ 错误:未配置ORACLE_HOME环境变量!echo 请执行:set ORACLE_HOME=你的Oracle安装目录(如D:\app\product\11.2.0\dbhome_1)echo.pause >nulexit /b 1
) else (:: 检查ORACLE_HOME下的sqlplus是否存在set "SQLPLUS_PATH=%ORACLE_HOME%\bin\sqlplus.exe"if not exist "!SQLPLUS_PATH!" (color %COLOR_ERROR%echo ❌ 错误:ORACLE_HOME路径无效(未找到sqlplus)!echo 当前ORACLE_HOME:%ORACLE_HOME%echo 请确认路径正确,且bin目录下存在sqlplus.exeecho.pause >nulexit /b 1)echo ✅ ORACLE_HOME已配置:%ORACLE_HOME%
):: 检查Oracle服务是否运行
echo.
echo [🔍 服务状态检查] 正在检查OracleService%ORACLE_SID%...
sc query "OracleService%ORACLE_SID%" | findstr "RUNNING" >nul 2>&1
if %errorlevel% equ 0 (echo ✅ OracleService%ORACLE_SID% 服务正在运行
) else (color %COLOR_ERROR%echo ❌ 错误:OracleService%ORACLE_SID% 服务未启动!echo 请按以下步骤操作:echo 1. 计算机 → 管理 → 服务 → 找到OracleService%ORACLE_SID%echo 2. 右键选择"启动",等待服务启动完成echo 3. 重新运行本脚本echo.pause >nulexit /b 1
)
color %COLOR_INFO%
echo.:: ==============================================
:: 第三步:自动识别数据库版本
:: ==============================================
echo [🔍 版本识别] 正在获取数据库版本...
for /f "tokens=3 delims= " %%v in ('sqlplus -v ^| findstr "Version"') do (set "FULL_VERSION=%%v"
)
:: 提取主版本号(如11.2.0.4 → 11,12.1.0.2 → 12)
for /f "tokens=1 delims=." %%v in ("!FULL_VERSION!") do (set "DB_VERSION=%%v"
)
if not defined DB_VERSION (color %COLOR_ERROR%echo ❌ 错误:无法识别数据库版本!echo 请确认sqlplus已加入PATH,或手动执行 sqlplus -v 检查echo.pause >nulexit /b 1
)
echo ✅ 数据库版本:!FULL_VERSION!(主版本:!DB_VERSION!)
echo.:: ==============================================
:: 第四步:自动选择对应的SQL脚本
:: ==============================================
echo [📝 脚本选择] 正在匹配对应脚本...
if !DB_VERSION! geq 12 (set "SQL_SCRIPT=check_recover_db_12c.sql"
) else (set "SQL_SCRIPT=check_recover_db.sql"
)
:: 检查脚本是否存在
if not exist "!SQL_SCRIPT!" (color %COLOR_ERROR%echo ❌ 错误:未找到脚本文件!echo 所需脚本:!SQL_SCRIPT!(需与本批处理同目录)echo 请确认脚本文件存在后重新运行echo.pause >nulexit /b 1
)
echo ✅ 自动选择脚本:!SQL_SCRIPT!
echo.:: ==============================================
:: 第五步:执行SQL脚本(sysdba身份)
:: ==============================================
color %COLOR_TITLE%
echo [🚀 执行检查] 正在通过sqlplus执行恢复检查脚本...
echo 执行命令:sqlplus "/ as sysdba" @!SQL_SCRIPT!
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
color %COLOR_INFO%
echo.:: 执行SQL脚本,捕获返回码
sqlplus "/ as sysdba" @!SQL_SCRIPT!
if %errorlevel% equ 0 (color %COLOR_SUCCESS%echo.echo ✅ 脚本执行成功!正在查找生成的HTML报告...echo.
) else (color %COLOR_ERROR%echo.echo ❌ 错误:sqlplus执行脚本失败!echo 可能原因:echo 1. 数据库实例未正常启动(处于STARTED状态需挂载)echo 2.  sysdba权限认证失败echo 3. SQL脚本存在语法错误echo.pause >nulexit /b 1
):: ==============================================
:: 第六步:展示报告文件(优化原dir命令)
:: ==============================================
color %COLOR_INFO%
echo [📄 报告列表] 生成的恢复检查报告如下(完整路径):
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
set "REPORT_FOUND=0"
:: 遍历当前目录下的报告文件,显示完整路径
for /f "delims=" %%f in ('dir /b /s "%cd%\%REPORT_PATTERN%" 2^>nul') do (echo ✅ %%fset "REPORT_FOUND=1"
)
if !REPORT_FOUND! equ 0 (color %COLOR_ERROR%echo ❌ 未找到生成的HTML报告!echo 可能原因:SQL脚本未生成报告,或报告文件名不匹配%REPORT_PATTERN%echo.
) else (color %COLOR_SUCCESS%echo.echo ✅ 报告查找完成!请复制上方路径直接打开查看echo.
):: ==============================================
:: 第七步:脚本结束
:: ==============================================
color %COLOR_TITLE%
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
echo 🎉 Oracle数据库恢复检查执行完成!
color %COLOR_INFO%
echo 提示:若需重新执行,可直接运行本批处理(无需重复配置环境)
echo.
pause >nul
endlocal

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月杭州集训记

前面的区域,以后再来探索吧。

Bash 入门指南-简介和常见命令

Bash 入门指南-简介和常见命令Bash 入门指南(第一部分):Bash 简介 概述 Bash(Bourne Again Shell)是目前 Unix 和 Linux 系统中最广泛使用的命令行解释器,也是绝大多数 Linux 发行版的默认 Shell。作为用户与操作…

最小多项式与线性递推

对角化 在众多 dp 问题中,我们经常可以用矩阵快速幂进行优化。更进一步地,如果这个递推矩阵是一个形如 \(A = \begin{pmatrix} 3 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 9 \end{pmatrix}\),矩阵…

Zabbix服务告警:More than 75% used in the configuration cache

Zabbix Server 在运行时,会将主机、监控项、触发器、模板等配置信息从数据库加载到内存中,以加快访问速度。这块内存区域就叫 配置缓(Configuration Cache)。该值可通过配置文件CacheSize进行调整。问题现象 随着监…

to kill a mocking bird

this book describe a English hero again but actually power is shared by people with violence not the mercy from the conscience. History tells us that humans live in Stockholm.

mounriver studio WINDOWS启动报错解决

mounriver studio WINDOWS启动报错解决解决方法卸载软件, 然后重新安装,安装完成之后不要选择启动软件。安装界面关闭之后,使用管理员权限打开软件,便不会报错

Linux 内核启动日志输出阶段分析

问题描述 在对比原理图后,发现打印日志的串口是UART2(GPIO3_A2 & GPIO3_A3),但设备树中只开启了UART0(GPIO1_C2&GPIO1_C3)/* 以下设备树内容来自多个设备树描述文件*/ &uart0 {pinctrl-names = "de…

flask: 封装返回json的统一格式

一,函数 from flask import jsonifydef success_response(data=None):"""结果响应:带数据和状态信息"""return jsonify({status: "success",code: 200,msg: "",d…

使用 Flask 构建本机 PyTorch 模型部署:从服务端搭建到客户端调用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python 潮流周刊#126:新一代静态网站生成器

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…

第二章数据预处理:公式Python代码完成

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《代码大全 2》观后感(七):代码重构 —— 让代码 “永葆青春”

“代码写完跑通了,就不用管了”—— 这是我过去的想法,直到读了《代码大全 2》中 “代码重构” 的章节,才明白:好代码不是 “一次写出来的”,而是 “不断改出来的”,重构就像 “给代码做体检”,能让它在长期迭代…

深入解析:MySQL 存储引擎深度解析:InnoDB 架构与配置优化指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做题记录(Nov.)

10 月链接11.1CSP,炸了。S-T1(P14361) 先让每个人选自己最大的,然后在人数最多的那个选项中,选择一些人换选项。把换选项造成的损失放在一起排序,选最小的若干个。记录一下一个人的两种损失不同时选。S-T2(P14362)…

OSPF协议详解4:实验 - OSPF区域、网络类型与高级路由控制实践 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年安徽猪肉批发厂家口碑排行TOP5

摘要 2025年,中国猪肉批发行业持续发展,随着消费升级和食品安全意识提升,品牌化、标准化成为趋势。安徽作为农业大省,猪肉批发市场活跃,多家企业凭借质量、服务和技术领先脱颖而出。本文基于行业数据、用户口碑和…

[国家集训队] 飞飞侠 题解

前言 题目链接:洛谷。 题意分析 显然需要三次单源最短路,但不能朴素建图。曼哈顿转成切比雪夫,然后 KD-T 或二维线段树优化建图即可。 最多 \(\mathcal{O}(n^2\times n)\) 条边,时间复杂度 \(\mathcal{O}(n^3\log …

插槽vue/react - 详解

插槽vue/react - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…