oracle rac自动表空间自动扩展脚本

vi check_tablespace.sh

bash 复制代码
#!/bin/bash
# Oracle RAC表空间监控脚本
# 功能:检查表空间使用率,自动扩展数据文件(需满足磁盘空间条件)

# 配置参数
VALT_PERCENT=85       # 表空间使用率阈值(%)
VFREE_SIZE=45         # ASM磁盘组最小空闲空间(GB)
LOG_FILE="/home/oracle/oracle_tablespace_monitor.log"

# 初始化日志
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

# 检查Oracle环境
check_env() {
    if [ ! -f "$ORACLE_HOME/bin/sqlplus" ]; then
        log "错误:未找到sqlplus,请检查ORACLE_HOME环境变量"
        exit 1
    fi
}

# 获取表空间使用情况
get_tablespace_usage() {
    sqlplus -S "/ as sysdba" <<EOF
    set pagesize 0 feedback off verify off heading off echo off
    select tablespace_name || '|' || round(used_percent,2) || '|' ||
           (select listagg(substr(file_name,2,instr(file_name,'/',1)-2),',')
            from dba_data_files where tablespace_name=a.tablespace_name)
    from dba_tablespace_usage_metrics a
    where used_percent > $VALT_PERCENT
    order by used_percent desc;
EOF
}

# 检查ASM磁盘空间
check_asm_space() {
    local dg_name=$1
    sqlplus -S "/ as sysdba" <<EOF
    set pagesize 0 feedback off verify off heading off echo off
    select trunc(free_mb/1024) from v\$asm_diskgroup where name='$dg_name';
EOF
}

# 添加数据文件
add_datafile() {
    local ts_name=$1
    sqlplus -S "/ as sysdba" <<EOF
    set pagesize 0 feedback off verify off heading off echo off
    alter tablespace $ts_name add datafile size 1G autoextend on next 100M;
EOF
}

# 主流程
main() {
    check_env
    log "===== 开始表空间检查 ====="

    # 使用临时文件替代进程替换
    tmp_file=$(mktemp)
    get_tablespace_usage > "$tmp_file"

    while IFS='|' read -r ts_name used_percent dg_list; do
        [ -z "$ts_name" ] && continue

        log "警告:表空间 ${ts_name} 使用率 ${used_percent}% 超过阈值 ${VALT_PERCENT}%"

        # 处理多个磁盘组
        IFS=',' read -ra dg_array <<< "$dg_list"
        for dg_name in "${dg_array[@]}"; do
            free_gb=$(check_asm_space "$dg_name")

            if [ $free_gb -ge $VFREE_SIZE ]; then
                result=$(add_datafile "$ts_name")
                if [ $? -eq 0 ]; then
                    log "成功:表空间 ${ts_name} 在磁盘组 ${dg_name} 上添加数据文件"
                else
                    log "错误:表空间 ${ts_name} 添加数据文件失败 - $result"
                fi
            else
                log "错误:磁盘组 ${dg_name} 剩余空间不足 (剩余: ${free_gb}GB < 阈值: ${VFREE_SIZE}GB)"
            fi
        done
    done < "$tmp_file"

    rm -f "$tmp_file"
    log "===== 检查完成 ====="
}

main "$@"

当空间够的时候,脚本提示:

oracle@rac1 \~\]$ sh check_tablespace.sh \[2025-07-17 11:09:18\] ===== 开始表空间检查 ===== \[2025-07-17 11:09:19\] ===== 检查完成 ===== 添加成功 \[oracle@rac1 \~\]$ sh check_tablespace.sh \[2025-07-17 11:36:23\] ===== 开始表空间检查 ===== \[2025-07-17 11:36:24\] 警告:表空间 TT 使用率 91.25% 超过阈值 85% \[2025-07-17 11:36:48\] 成功:表空间 TT 在磁盘组 DATA 上添加数据文件 \[2025-07-17 11:36:48\] ===== 检查完成 ===== 当磁盘组空间少于设置的阀值: \[oracle@rac1 \~\]$ sh check_tablespace.sh \[2025-07-17 11:14:55\] ===== 开始表空间检查 ===== \[2025-07-17 11:14:56\] 警告:表空间 TT 使用率 91.25% 超过阈值 85% \[2025-07-17 11:14:57\] 错误:磁盘组 DATA 剩余空间不足 (剩余: 49GB \< 阈值: 100GB) \[2025-07-17 11:14:57\] ===== 检查完成 ===== 最后把脚本添加到contab中

相关推荐
Rysxt_3 分钟前
Spring Boot SPI 教程
java·数据库·sql
避避风港35 分钟前
MySQL 从入门到实战
数据库·mysql
s***45337 分钟前
MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序
数据库·microsoft
能鈺CMS1 小时前
能鈺CMS · 虚拟发货源码
java·大数据·数据库
泡沫·2 小时前
4.iSCSI 服务器
运维·服务器·数据库
胡八一2 小时前
解决PHP未检测到您服务器环境的sqlite3数据库扩展报错
服务器·数据库·php
Wang's Blog2 小时前
MongoDB小课堂: 游标操作与文档投影技术深度解析
数据库·mongodb
q***42052 小时前
使用Django Rest Framework构建API
数据库·django·sqlite
Charles_go2 小时前
C#中级46、什么是模拟
开发语言·oracle·c#
张人玉3 小时前
SQLite语法知识和使用实例
jvm·oracle·sqlite