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中

相关推荐
倔强的石头_15 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql