一、 RAC 集群整体状态巡检
在进行存储检查前,需确保集群基础服务正常。建议切换到 grid 用户执行以下操作:
1 检查集群整体状态
bash
crsctl check cluster -all
确认各节点的 Cluster Ready Services、Synchronization Services 等均处于 online 状态。
eg:
bash
[grid@db01 ~]$ crsctl check cluster -all
**************************************************************
emrhxdb01:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
emrhxdb02:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
2 检查所有集群资源状态
bash
crsctl stat res -t
重点关注数据库实例、ASM 实例、VIP、SCAN 监听等资源是否均为 ONLINE 且状态为 STABLE。
eg:
bash
[grid@db01 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
ONLINE ONLINE db01 STABLE
ONLINE ONLINE db02 STABLE
ora.chad
ONLINE OFFLINE db01 STABLE
ONLINE ONLINE db02 STABLE
ora.net1.network
ONLINE ONLINE db01 STABLE
ONLINE ONLINE db02 STABLE
ora.ons
ONLINE ONLINE db01 STABLE
ONLINE ONLINE db02 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNEWLSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE db01 STABLE
2 ONLINE ONLINE db02 STABLE
3 ONLINE OFFLINE STABLE
ora.DATA.dg(ora.asmgroup)
1 ONLINE ONLINE db01 STABLE
2 ONLINE ONLINE db02 STABLE
3 OFFLINE OFFLINE STABLE
ora.FRA.dg(ora.asmgroup)
1 ONLINE ONLINE db01 STABLE
2 ONLINE ONLINE db02 STABLE
3 OFFLINE OFFLINE STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE db01 STABLE
ora.OCR.dg(ora.asmgroup)
1 ONLINE ONLINE db01 STABLE
2 ONLINE ONLINE db02 STABLE
3 OFFLINE OFFLINE STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE db01 Started,STABLE
2 ONLINE ONLINE db02 Started,STABLE
3 OFFLINE OFFLINE STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE db01 STABLE
2 ONLINE ONLINE db02 STABLE
3 ONLINE OFFLINE STABLE
ora.cvu
1 ONLINE ONLINE db01 STABLE
ora.emrdb.db
1 ONLINE ONLINE db01 Open,HOME=/u01/app/o
racle/product/19c/db
_1,STABLE
2 ONLINE ONLINE db02 Open,HOME=/u01/app/o
racle/product/19c/db
_1,STABLE
ora.db01.vip
1 ONLINE ONLINE db01 STABLE
ora.db02.vip
1 ONLINE ONLINE db02 STABLE
ora.qosmserver
1 ONLINE ONLINE db01 STABLE
ora.scan1.vip
1 ONLINE ONLINE db01 STABLE
--------------------------------------------------------------------------------
3 检查节点状态
bash
olsnodes -s
确认所有节点均处于 Active 状态
eg:
bash
[grid@db01 ~]$ olsnodes -s
db01 Active
db02 Active
[grid@db01 ~]$
二、 ASM 磁盘组使用情况检查(核心)
ASM 存储是 RAC 的核心,需重点关注磁盘组空间、冗余状态及底层物理磁盘健康度
1 命令行快速检查(推荐)
切换到 grid 用户,使用 asmcmd 工具:
bash
asmcmd lsdg
此命令可直观查看各磁盘组的状态(State)、冗余类型(Type)、总容量(Total_MB)、逻辑可用空间(Free_MB)以及真实可写上限(Usable_file_MB)
eg:
bash
[grid@db01 ~]$ asmcmd lsdg
State Type Rebal Sector Logical_Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 512 4096 4194304 3145728 2018960 0 2018960 0 N DATA/
MOUNTED EXTERN N 512 512 4096 4194304 1048576 821712 0 821712 0 N FRA/
MOUNTED NORMAL N 512 512 4096 4194304 153600 152484 30720 60882 0 Y OCR/
[grid@db01 ~]$
2 SQL 深度检查
检查磁盘组整体空间与冗余:
sql
SELECT name, state, type, total_mb, free_mb, usable_file_mb, offline_disks
FROM v$asm_diskgroup_stat;
在 NORMAL 或 HIGH 冗余下,不要只看 FREE_MB。USABLE_FILE_MB 才是考虑了镜像和故障恢复所需空间后的真实可用空间。如果该值低于阈值,可能会触发写入拒绝。同时需确认 OFFLINE_DISKS 是否为 0
检查底层物理磁盘状态:
sql
SELECT name, path, mount_status, state, disk_number, total_mb, free_mb, group_number
FROM v$asm_disk;
确认所有磁盘的 STATE 正常,且 HEADER_STATUS 为 MEMBER(表示磁盘已在组内正常服役)
检查数据重平衡(Rebalance)进度
sql
SELECT group_number, operation, state, power, est_minutes
FROM v$asm_operation;
如果在添加或移除磁盘后,该视图有记录且状态为 REBAL,说明正在进行数据重平衡。此时 Free_MB 会暂时下降,属于正常现象,需等待其完成
补充:
视图选择: 日常自动化采集 ASM 空间时,建议优先使用 VASM_DISKGROUP_STAT 而非 VASM_DISKGROUP,因为后者每次查询都会触发磁盘发现操作,可能对性能产生轻微影响。
告警日志检查: 巡检时务必检查 $ORACLE_BASE/diag/rdbms/.../trace/alert_<SID>.log 以及 GI 目录下的 alert 日志,过滤 ORA- 错误及 ASM 相关的 I/O 报错4。
**备份验证:**存储检查不能脱离备份,需确认近期的 RMAN 备份任务状态为 COMPLETED,且归档日志备份连续无中断
三、自动化巡检脚本
针对 Oracle 19c RAC 环境的自动化巡检 Shell 脚本(使用 oracle 或 grid 用户运行)。该脚本整合了 RAC 集群状态、ASM 磁盘组空间、数据库实例状态等核心检查项。
bash
#!/bin/bash
#================================================================
# 脚本名称: oracle_rac_check.sh
# 功能描述: Oracle 19c RAC 自动化巡检脚本
# 适用环境: Oracle 19c RAC, Linux/Unix
# 注意事项: 请使用 oracle 或 grid 用户执行此脚本
#================================================================
# ================= 环境变量配置区 =================
# 请根据实际环境修改以下变量
export ORACLE_HOME=/u01/app/oracle/product/19c/db_1
export GRID_HOME=/u01/app/19c/grid # 替换为实际的GRID目录
export ORACLE_BASE=/u01/app/oracle
export ORACLE_SID=db1 # 替换为当前节点的实例名
export ORACLE_PDB_SID=pdb # 替换为默认连接的服务名 SQLPLUS默认连接使用
export PATH=$PATH:$ORACLE_HOME/bin:$GRID_HOME/bin # 包含 grid 的 bin 目录
LOG_FILE="/tmp/oracle_rac_check_$(date +%Y%m%d_%H%M%S).log"
# ================= 辅助函数 =================
print_header() {
echo "" | tee -a $LOG_FILE
echo "========================= $1 =========================" | tee -a $LOG_FILE
}
run_sql() {
sqlplus -S / as sysdba <<EOF | tee -a $LOG_FILE
SET FEEDBACK OFF HEADING ON LINESIZE 200 PAGESIZE 100
$1
EXIT;
EOF
}
# ================= 巡检主逻辑 =================
# 1. RAC 集群整体状态检查
print_header "1. RAC 集群整体状态检查"
echo ">> 检查集群资源状态 (crsctl stat res -t):" | tee -a $LOG_FILE
crsctl stat res -t | tee -a $LOG_FILE
echo "" | tee -a $LOG_FILE
echo ">> 检查节点状态 (olsnodes -s):" | tee -a $LOG_FILE
olsnodes -s | tee -a $LOG_FILE
# 2. ASM 磁盘组使用情况检查
print_header "2. ASM 磁盘组使用情况检查"
echo ">> 快速检查 (asmcmd lsdg):" | tee -a $LOG_FILE
asmcmd lsdg | tee -a $LOG_FILE
echo "" | tee -a $LOG_FILE
echo ">> SQL 深度检查 (v\$asm_diskgroup_stat):" | tee -a $LOG_FILE
run_sql "SELECT name, state, type, ROUND(total_mb/1024,2) AS total_gb, ROUND(free_mb/1024,2) AS free_gb, ROUND(usable_file_mb/1024,2) AS usable_gb, offline_disks FROM v\$asm_diskgroup_stat;"
# 3. 数据库实例与表空间巡检
print_header "3. 数据库实例与表空间巡检"
echo ">> 检查数据库实例状态 (srvctl status database):" | tee -a $LOG_FILE
# 获取数据库名(假设实例名为 orcl1,则数据库名为 orcl)
DB_NAME=$(echo $ORACLE_SID | sed 's/[0-9]*$//')
srvctl status database -d $DB_NAME | tee -a $LOG_FILE
echo "" | tee -a $LOG_FILE
echo ">> 检查表空间使用率:" | tee -a $LOG_FILE
run_sql "SELECT tablespace_name, ROUND(used_percent, 2) AS used_percent FROM dba_tablespace_usage_metrics ORDER BY used_percent DESC;"
# 4. 基础健康度检查
print_header "4. 基础健康度检查"
echo ">> 检查无效对象:" | tee -a $LOG_FILE
run_sql "SELECT owner, object_type, COUNT(*) FROM dba_objects WHERE status != 'VALID' AND owner NOT IN ('SYS','SYSTEM') GROUP BY owner, object_type;"
echo "" | tee -a $LOG_FILE
echo ">> 检查 Alert 日志最近的 ORA- 错误 (最后10条):" | tee -a $LOG_FILE
ALERT_LOG="$ORACLE_BASE/diag/rdbms/$DB_NAME/$ORACLE_SID/trace/alert_$ORACLE_SID.log"
if [ -f "$ALERT_LOG" ]; then
grep "ORA-" "$ALERT_LOG" | tail -n 10 | tee -a $LOG_FILE
else
echo "未找到 Alert 日志文件: $ALERT_LOG" | tee -a $LOG_FILE
fi
print_header "巡检完成"
echo "巡检报告已生成: $LOG_FILE"
使用说明
-
配置环境变量 :打开脚本,修改
ORACLE_HOME、ORACLE_SID和PATH为您实际环境中的路径。 -
赋予执行权限:
bashchmod +x oracle_rac_check.sh执行脚本:
bash./oracle_rac_check.sh查看结果:脚本不仅会在终端实时输出巡检结果,还会自动将完整报告保存到 /tmp/ 目录下(文件名包含时间戳),方便后续查阅
脚本核心功能说明
- 集群状态 :通过
crsctl和olsnodes检查 RAC 节点及资源(如 VIP、SCAN、ASM 实例)是否全部处于 ONLINE 状态。 - ASM 存储 :结合了
asmcmd lsdg的直观视图和v$asm_diskgroup_stat的 SQL 深度查询,特别输出了USABLE_GB(真实可用空间)和OFFLINE_DISKS(离线磁盘数),这是 RAC 存储巡检最关键的指标。 - 数据库层:自动获取数据库名称并检查实例运行状态,同时排查表空间使用率及无效对象。
- 日志排查 :自动抓取 Alert 日志中最近的
ORA-错误,帮助快速定位潜在隐患