Oracle CDB巡检脚本使用SOP:从HTML原始报告到Word正式交付_2026-05-29

一、适用范围

本 SOP 适用于 Oracle 12c 及以上版本的 CDB/PDB 架构数据库巡检,适用于 Oracle 单实例、Oracle RAC 等常见部署环境。

说明1:

复制代码
1. 本脚本主要面向 Oracle 12c 及以上版本的多租户架构,即 CDB/PDB 架构;
2. Oracle 11g 及以下版本不支持 CDB/PDB 架构,不适用本 CDB 巡检脚本;
3. 如果数据库为非 CDB 架构,应使用对应的非 CDB 巡检脚本或单实例巡检脚本;
4. 本 SOP 以下命令以 Oracle 19c 环境为示例,Oracle 12c 及以上版本可根据实际环境参考执行。

说明2:

复制代码
HTML 报告:脚本自动生成的原始巡检结果,适合技术人员查看明细数据;
Word 报告:基于 HTML 结果整理形成的正式交付报告,适合提交领导、归档审计、整改闭环。

二、执行原则

  1. 巡检脚本必须使用 oracle 用户执行。

  2. 巡检脚本必须在 oracle 用户有写权限的目录下执行。

  3. 巡检目录不固定,可根据服务器实际磁盘空间选择。

  4. 以下命令以 /u02/dbcheck 为示例目录,实际环境可根据磁盘空间调整。

  5. 在单实例环境中,每个 CDB 通常对应一个 ORACLE_SID;在 RAC 环境中,一个 CDB 会对应多个实例,每个节点都有各自的本地 ORACLE_SID

  6. 执行巡检时,应根据当前所在节点选择本节点对应的 ORACLE_SID

  7. 日常巡检时,每个 CDB 选择一个节点执行一次即可;如为季度巡检、重大变更前巡检或需要保留节点侧信息,建议在 RAC 各节点分别执行。

  8. 本脚本属于 CDB 级巡检脚本,应在 CDB$ROOT 下执行。

  9. 不建议直接在具体 PDB 下执行本脚本,否则 ASM、RMAN、DG、AWR、实例级信息可能不完整。

  10. 执行过程需要保留日志,方便后续追溯。

  11. 为避免 HTML 报告中圆点等特殊字符乱码,执行前统一设置 UTF-8 客户端环境变量。

  12. 正式文档中不得保留真实 IP、密码、主机名、业务敏感路径等信息,涉及服务器地址统一使用脱敏占位符。


三、选择巡检目录

执行前先查看磁盘空间:

复制代码
df -h

建议选择满足以下条件的目录:

复制代码
1. 剩余空间充足;
2. oracle 用户可以写入;
3. 不影响数据库数据文件、归档、备份目录;
4. 路径固定,便于后续下载和归档;
5. 不建议使用 /tmp 作为长期巡检目录。

常见可选目录示例:

复制代码
/u02/dbcheck
/home/oracle/dbcheck
/data/oracle/dbcheck

本 SOP 以下统一以 /u02/dbcheck 为示例。实际生产环境中,可根据磁盘空间和运维规范选择其他目录。


四、目录初始化

使用 root 用户执行:

复制代码
mkdir -p /u02/dbcheck
chown -R oracle:oinstall /u02/dbcheck
chmod 750 /u02/dbcheck

确认目录权限:

复制代码
ll -ld /u02/dbcheck

正常应类似:

复制代码
drwxr-x--- 2 oracle oinstall ... /u02/dbcheck

说明:

复制代码
/u02/dbcheck 只是示例目录,实际可根据磁盘空间选择其他路径。
目录必须保证 oracle 用户可写,否则巡检脚本执行后可能无法生成 HTML 报告。

五、上传或拉取巡检脚本

如果从其他服务器拉取脚本,使用 root 用户执行:

复制代码
scp root@<源服务器IP>:/path/to/dbcheck_cdb.sql /u02/dbcheck/

说明:

复制代码
<源服务器IP>、/path/to/ 需要根据实际环境替换。
正式文档中不得保留真实 IP、密码、主机名等敏感信息。

修改脚本属主和权限:

复制代码
chown oracle:oinstall /u02/dbcheck/dbcheck_cdb.sql
chmod 640 /u02/dbcheck/dbcheck_cdb.sql

确认脚本文件:

复制代码
ll /u02/dbcheck/dbcheck_cdb.sql

正常应类似:

复制代码
-rw-r----- 1 oracle oinstall ... /u02/dbcheck/dbcheck_cdb.sql

六、确认当前节点数据库实例

切换到 oracle 用户:

复制代码
su - oracle

查看当前节点实例:

复制代码
ps -ef | grep pmon | grep -v grep

示例:

复制代码
ora_pmon_<实例名1>
ora_pmon_<实例名2>
ora_pmon_<实例名3>

其中:

复制代码
ora_pmon_<实例名>

对应的 ORACLE_SID 为:

复制代码
<实例名>

注意:

复制代码
RAC 环境中,实例名通常带节点号。
例如同一个 CDB,在节点 1 上可能是 <cdb_name>1,在节点 2 上可能是 <cdb_name>2。
执行巡检时必须使用当前节点实际存在的本地实例名。

七、执行前确认数据库连接

<实例名> 为例:

复制代码
cd /u02/dbcheck
export ORACLE_SID=<实例名>
sqlplus / as sysdba

进入 SQLPlus 后执行:

复制代码
show con_name;
show pdbs;
select name, open_mode, database_role, cdb from v$database;
exit

重点确认:

复制代码
CON_NAME = CDB$ROOT
PDB 状态正常
DATABASE_ROLE = PRIMARY
CDB = YES

说明:

复制代码
show con_name 用于确认当前容器;
show pdbs 用于查看当前 CDB 下 PDB 打开状态;
v$database 用于确认数据库名称、打开状态、角色和是否为 CDB。

八、标准巡检执行命令

<实例名> 为例:

复制代码
cd /u02/dbcheck
export ORACLE_SID=<实例名>
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

sqlplus / as sysdba <<EOF | tee /u02/dbcheck/dbcheck_run_<实例名>_$(date +%Y%m%d_%H%M%S).log
show con_name;
show pdbs;
alter session set container=CDB\$ROOT;
@/u02/dbcheck/dbcheck_cdb.sql
exit
EOF

说明:

复制代码
cd /u02/dbcheck
进入巡检目录,HTML 报告会生成到当前目录。

export ORACLE_SID=<实例名>
指定当前要巡检的数据库实例。

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
指定 SQLPlus 客户端输出编码为 UTF-8,不修改数据库字符集。

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
指定当前 Linux 会话字符环境为 UTF-8,不修改数据库。

tee /u02/dbcheck/dbcheck_run_<实例名>_时间.log
屏幕显示执行过程,同时保存执行日志。

alter session set container=CDB$ROOT
确保脚本在 CDB 根容器下执行。

注意:在 shell 命令中必须写成:

复制代码
CDB\$ROOT

因为 $ROOT 会被 Linux shell 当成变量解析,加反斜杠是为了原样传给 SQLPlus。


九、巡检结果确认

执行完成后,查看 HTML 报告:

复制代码
ls -lh /u02/dbcheck/*.html

查看最新生成的报告:

复制代码
ls -lt /u02/dbcheck/*.html | head

查看执行日志:

复制代码
ls -lt /u02/dbcheck/dbcheck_run_*.log | head

正常结果示例:

复制代码
dbcheck_<DBID>_<DBNAME>_<VERSION>_<YYYYMMDD>.html
dbcheck_run_<实例名>_<YYYYMMDD_HHMMSS>.log

如果日志中出现:

复制代码
Database script execution ends

说明脚本执行完成。


十、其他 CDB 执行方法

同一节点上如果还有其他 CDB,只需要替换 ORACLE_SID 和日志文件名。

示例一:巡检实例 <实例名1>

复制代码
cd /u02/dbcheck
export ORACLE_SID=<实例名1>
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

sqlplus / as sysdba <<EOF | tee /u02/dbcheck/dbcheck_run_<实例名1>_$(date +%Y%m%d_%H%M%S).log
show con_name;
show pdbs;
alter session set container=CDB\$ROOT;
@/u02/dbcheck/dbcheck_cdb.sql
exit
EOF

示例二:巡检实例 <实例名2>

复制代码
cd /u02/dbcheck
export ORACLE_SID=<实例名2>
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

sqlplus / as sysdba <<EOF | tee /u02/dbcheck/dbcheck_run_<实例名2>_$(date +%Y%m%d_%H%M%S).log
show con_name;
show pdbs;
alter session set container=CDB\$ROOT;
@/u02/dbcheck/dbcheck_cdb.sql
exit
EOF

十一、关于 PDB 巡检说明

本脚本是 CDB 级巡检脚本,标准执行位置是 CDB$ROOT

如果一个 CDB 下存在多个 PDB,也不建议直接切换到具体 PDB 后执行 dbcheck_cdb.sql

原因如下:

复制代码
1. 本脚本包含 CDB / 实例 / RAC / ASM / RMAN / DG / AWR 等全局巡检信息;
2. 切到具体 PDB 后执行,部分查询结果可能为空、不完整或报错;
3. 生成的报告不能完整反映整个 CDB 的健康状态;
4. 如果需要单独巡检某个 PDB,应使用 PDB 专项巡检 SQL,而不是使用本 CDB 巡检脚本。

因此,本 SOP 中 dbcheck_cdb.sql 统一要求在 CDB$ROOT 下执行。


十二、多套 Oracle 数据库巡检原则

1. 日常巡检

日常巡检时,每套 Oracle 数据库环境选择合适节点执行即可。

原则:

复制代码
每套 Oracle 数据库环境
每个 CDB
执行一次 dbcheck_cdb.sql
生成一份 HTML 报告

说明:

复制代码
在 RAC 环境中,一个 CDB 在多个节点上会有多个实例。
日常巡检通常选择其中一个节点执行即可,报告可反映该 CDB 的主要数据库级信息。

2. 季度巡检、重大变更前巡检

建议 RAC 各节点分别执行。

原因:

复制代码
数据库字典类信息在任一节点执行基本一致;
但实例级信息、节点侧信息、alert log、部分本地诊断信息,可能与具体节点有关。

建议执行范围:

复制代码
单实例环境:每个 CDB 执行一次;
RAC 环境:每个 CDB 可选择一个节点执行;如需保留节点侧信息,建议各节点分别执行。

十三、报告复制与下载

如果通过 JumpServer 堡垒机连接服务器,部分环境下只能从 /tmp 等指定目录下载文件到本地。因此,巡检报告生成后,可将 HTML 报告复制到 /tmp 目录,便于通过堡垒机下载。

将所有 HTML 报告复制到 /tmp

复制代码
cp /u02/dbcheck/*.html /tmp/

如果需要同时复制日志:

复制代码
cp /u02/dbcheck/*.log /tmp/

说明:

复制代码
/u02/dbcheck 为巡检报告生成目录;
/tmp 为临时中转目录,主要用于配合 JumpServer 堡垒机下载报告到本地;
下载完成后,可根据安全要求清理 /tmp 中的临时报告文件。

也可以打包后再复制到 /tmp

复制代码
cd /u02
tar -zcvf dbcheck_$(hostname)_$(date +%Y%m%d).tar.gz dbcheck/*.html dbcheck/*.log
cp dbcheck_$(hostname)_$(date +%Y%m%d).tar.gz /tmp/

确认文件:

复制代码
ls -lh /tmp/dbcheck_*

十四、原始巡检材料归档

巡检完成后,建议至少保留以下三类文件:

复制代码
1. HTML 原始巡检报告;
2. SQLPlus 执行日志;
3. 巡检脚本原始文件。

推荐归档命名:

复制代码
HTML 原始报告:dbcheck_<DBID>_<DBNAME>_<VERSION>_<YYYYMMDD>.html
执行日志:dbcheck_run_<实例名>_<YYYYMMDD_HHMMSS>.log
巡检脚本:dbcheck_cdb.sql

如需统一打包归档,可执行:

复制代码
cd /u02
tar -zcvf oracle_dbcheck_$(hostname)_$(date +%Y%m%d).tar.gz dbcheck/*.html dbcheck/*.log dbcheck/dbcheck_cdb.sql

归档要求:

复制代码
1. 归档文件应保存到统一巡检资料目录;
2. 如需上传共享平台或提交外部人员,必须先进行敏感信息脱敏;
3. HTML 原始报告不建议直接作为正式交付材料,应作为 Word 正式报告的原始依据。

十五、常见问题处理

1. 执行后没有生成 HTML

优先检查当前目录是否可写:

复制代码
touch /u02/dbcheck/test_write

如果提示权限不足,说明 oracle 用户不能在当前目录写文件。

处理方式:

复制代码
cd /u02/dbcheck

重新执行巡检脚本。


2. HTML 报告里圆点显示乱码

执行前增加以下环境变量:

复制代码
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

这些变量只影响当前 shell 和当前 SQLPlus 客户端输出,不修改数据库字符集,不修改 CDB/PDB,不修改业务数据。


3. ORACLE_SID 设置错误

重新查看实例:

复制代码
ps -ef | grep pmon | grep -v grep

根据 ora_pmon_实例名 设置正确的 ORACLE_SID


4. 复制报告时报 No such file or directory

检查文件名和后缀是否写错。

正确后缀是:

复制代码
.html

不是:

复制代码
.htm

5. 巡检目录不是 /u02/dbcheck 怎么办

/u02/dbcheck 只是示例目录。

如果实际选择其他目录,需要将命令中的 /u02/dbcheck 统一替换为实际目录。

例如:

复制代码
/home/oracle/dbcheck

或:

复制代码
/data/oracle/dbcheck

十六、最终标准命令模板

以后每个 CDB 巡检都按这个模板执行,只替换 ORACLE_SID 和日志名中的实例名。

复制代码
cd /u02/dbcheck
export ORACLE_SID=<实例名>
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

sqlplus / as sysdba <<EOF | tee /u02/dbcheck/dbcheck_run_<实例名>_$(date +%Y%m%d_%H%M%S).log
show con_name;
show pdbs;
alter session set container=CDB\$ROOT;
@/u02/dbcheck/dbcheck_cdb.sql
exit
EOF

执行完成后确认:

复制代码
ls -lt /u02/dbcheck/*.html | head
ls -lt /u02/dbcheck/dbcheck_run_*.log | head

十七、最终交付:基于 HTML 结果整理 Word 巡检报告

在脚本执行、HTML 报告生成、日志留存、报告下载和原始材料归档完成后,最后一步是基于 HTML 原始结果整理正式 Word 巡检报告。

两类报告的定位如下:

复制代码
HTML 报告:
脚本自动生成的原始巡检结果,保留完整采集数据,适合作为技术核查、问题追溯和附件留档依据。

Word 报告:
基于 HTML 报告提炼形成的正式交付材料,重点体现巡检结论、风险项、整改建议和管理层可读内容。

正式 Word 巡检报告建议包含以下内容:

复制代码
1. 巡检报告封面
2. 巡检对象与巡检时间
3. 数据库基本信息
4. 数据库配置概要
5. 数据库组件和补丁情况
6. 初始化参数和资源使用情况
7. 控制文件、Redo 日志、归档模式检查
8. 表空间使用情况与增长趋势
9. 无效对象、回收站、SYSTEM 表空间对象检查
10. AWR 和 SYSAUX 使用情况
11. 用户、Profile、密码策略等安全风险检查
12. 自动任务检查
13. 数据库性能评估
14. RMAN 备份、DataGuard、Alert 日志检查
15. 问题清单、整改建议与巡检结论

整理 Word 报告时需要注意:

复制代码
1. 正式报告中不得保留真实 IP、密码、主机名等敏感信息;
2. 数据库名、主机名、业务系统名称可根据提交对象决定是否脱敏;
3. 对异常项要给出明确结论,例如"正常""待关注""建议整改";
4. 对风险项应说明影响范围和处理建议;
5. HTML 原始报告和 Word 巡检报告应一并归档,便于后续追溯。

推荐交付文件:

复制代码
1. HTML 原始巡检报告;
2. Word 正式巡检报告;
3. SQLPlus 执行日志;
4. 巡检脚本原始文件。

一句话总结:

复制代码
HTML 是原始巡检结果,Word 是正式交付报告。

十八、SOP 总结

本巡检脚本标准执行流程为:

复制代码
选择空间充足的巡检目录
root 创建巡检目录
上传 dbcheck_cdb.sql
授权给 oracle 用户
切换 oracle 用户
确认 pmon 实例名
设置当前节点对应的 ORACLE_SID
设置 UTF-8 客户端环境变量
在 CDB$ROOT 下执行脚本
生成 HTML 原始巡检报告
保留执行日志
根据需要复制到 /tmp 通过 JumpServer 下载
归档 HTML、日志和脚本
最后基于 HTML 结果整理 Word 正式交付报告

核心标准:

复制代码
oracle 用户执行
巡检目录根据实际磁盘空间选择
每个 CDB 执行一次
RAC 环境使用当前节点对应的本地 ORACLE_SID
CDB$ROOT 下执行
不在具体 PDB 下执行 dbcheck_cdb.sql
HTML 作为原始巡检结果
Word 作为正式交付报告
保留 HTML 报告、Word 报告和 log 日志

附录一:dbcheck_cdb.sql 巡检脚本全文

本附录用于保存本次 Oracle CDB 巡检所使用的 dbcheck_cdb.sql 脚本全文,便于后续复核、版本管理、问题追溯和重复使用。

脚本正式纳入文档前,应确认以下事项:

复制代码
1. 脚本中不得包含真实 IP、密码、账号口令、主机敏感信息;
2. 如脚本中存在环境相关路径,应根据实际环境确认是否需要脱敏;
3. 如后续脚本发生变更,应同步更新本文档中的脚本版本;
4. 建议保留脚本文件名、使用日期、适用数据库版本等基本信息。

脚本信息:

复制代码
脚本名称:dbcheck_cdb.sql
适用版本:Oracle 12c 及以上版本
适用架构:Oracle CDB/PDB 多租户架构
适用范围:Oracle CDB 级数据库巡检
执行位置:CDB$ROOT
执行用户:oracle
输出格式:HTML

脚本全文如下:

相关推荐
難釋懷2 小时前
Nginx自签名-OpenSSL
运维·chrome·nginx
保定公民2 小时前
Oracle 层次查询(CONNECT BY)完全指南:从入门到精通
数据库·sql·oracle·达梦数据库·层次查询
2301_780029042 小时前
互联网架构演进精读:从单机到云原生
云原生·架构
2301_803538952 小时前
CentOS版本差异详解和系统信息查看方法
linux·运维·centos
IT策士2 小时前
第14篇 Docker Compose 开发环境最佳实践:热重载与调试
运维·docker·容器
运维老郭2 小时前
【Kubernetes 性能排查】线上服务突然变慢?SRE 的 4 层排查法
运维·云原生·kubernetes
Cx330❀2 小时前
【Linux网络】从零构建高性能UDP服务器:从Echo到英译汉业务级实现
大数据·linux·服务器·开发语言·网络·c++·udp
正在走向自律2 小时前
架构进阶:从 Docker 环境变量到 Nacos 统一配置中心实战
docker·容器·架构
闪电悠米2 小时前
黑马点评-优惠券秒杀-03_basic_seckill_and_oversell
java·数据库·spring boot·spring·缓存·oracle·面试