Oracle19 RAC查看集群状态及磁盘空间情况(巡检)

一、 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"

使用说明

  1. 配置环境变量 :打开脚本,修改 ORACLE_HOME、ORACLE_SID 和 PATH 为您实际环境中的路径。

  2. 赋予执行权限:

    bash 复制代码
    chmod +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- 错误,帮助快速定位潜在隐患
相关推荐
zyseo87 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
xiaogai_gai9 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o9 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
这个DBA有点耶10 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户62799471826211 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹11 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿11 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪11 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛11 小时前
导出mysql数据结构
数据库·mysql
GlobalTradercrb11 小时前
独立站SEO先写博客还是先优化产品页?看站点阶段
数据库·人工智能·google·pdf·go·seo