一、适用范围
本 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 结果整理形成的正式交付报告,适合提交领导、归档审计、整改闭环。
二、执行原则
-
巡检脚本必须使用
oracle用户执行。 -
巡检脚本必须在
oracle用户有写权限的目录下执行。 -
巡检目录不固定,可根据服务器实际磁盘空间选择。
-
以下命令以
/u02/dbcheck为示例目录,实际环境可根据磁盘空间调整。 -
在单实例环境中,每个 CDB 通常对应一个
ORACLE_SID;在 RAC 环境中,一个 CDB 会对应多个实例,每个节点都有各自的本地ORACLE_SID。 -
执行巡检时,应根据当前所在节点选择本节点对应的
ORACLE_SID。 -
日常巡检时,每个 CDB 选择一个节点执行一次即可;如为季度巡检、重大变更前巡检或需要保留节点侧信息,建议在 RAC 各节点分别执行。
-
本脚本属于 CDB 级巡检脚本,应在
CDB$ROOT下执行。 -
不建议直接在具体 PDB 下执行本脚本,否则 ASM、RMAN、DG、AWR、实例级信息可能不完整。
-
执行过程需要保留日志,方便后续追溯。
-
为避免 HTML 报告中圆点等特殊字符乱码,执行前统一设置 UTF-8 客户端环境变量。
-
正式文档中不得保留真实 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
脚本全文如下: