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中

相关推荐
wjpwjpwjp08311 小时前
[MySQL基础3] 数据控制语言DCL和MySQL中的常用函数
数据库·笔记·后端·学习·mysql
dustcell.1 小时前
数据库第二次作业
数据库
PP东1 小时前
Mybatis学习之简介(一)
学习·oracle·mybatis
小云数据库服务专线2 小时前
GaussDB 数据库架构师修炼(三) 集群管理概览
数据库·数据库架构·gaussdb
爬山算法2 小时前
MySQL(144)如何处理日期和时间问题?
数据库·mysql
熊文豪2 小时前
国产电科金仓数据库:融合进化,智领未来
数据库·国产数据库·金仓数据库·电科金仓
有想法的py工程师3 小时前
Ansible 查看PostgreSQL的版本
数据库·postgresql·ansible
时序数据说3 小时前
工业物联网中的时序数据库应用
大数据·数据库·物联网·时序数据库·iotdb
YuforiaCode3 小时前
使用DataGrip连接安装在Linux上的Redis
数据库·redis·缓存
羊羊羊i3 小时前
MySQL的关键日志
数据库·mysql