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- 错误,帮助快速定位潜在隐患
相关推荐
钝挫力PROGRAMER1 小时前
开发踩坑记:MyBatis selectKey、空 SQL
数据库·sql·mybatis
JosieBook1 小时前
【数据库】MySQL 实战精通系列 · 第6篇:InnoDB 存储引擎、日志与崩溃恢复
数据库·mysql
杨云龙UP2 小时前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
梦帮科技2 小时前
领域认知知识库图谱注入:从双式记账图网络到高质量问答对自动化合成流水线
运维·网络·数据库·人工智能·矩阵·架构·自动化
Long long ago.2 小时前
vastbase数据库运行sql宕机重启解决
数据库·sql
SelectDB技术团队3 小时前
一条日志两套引擎的账:把 Elasticsearch 检索与分析合并到同一份数据的落地写法
大数据·数据库·elasticsearch·搜索引擎·全文检索·日志·apache doris
数据库百宝箱3 小时前
rum&gin索引对比
java·数据库·gin
wefg14 小时前
【Redis】初识 Redis
数据库·redis·缓存
hacker_LeeFei6 小时前
Windows 下配置 Redis 8.10.2 开机自启:一次踩坑全记录
数据库·windows·redis