oracle rac自动表空间自动扩展脚本
vi check_tablespace.sh
#!/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" ]; thenlog "错误:未找到sqlplus,请检查ORACLE_HOME环境变量"exit 1fi
}# 获取表空间使用情况
get_tablespace_usage() {sqlplus -S "/ as sysdba" <<EOFset pagesize 0 feedback off verify off heading off echo offselect 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 awhere used_percent > $VALT_PERCENTorder by used_percent desc;
EOF
}# 检查ASM磁盘空间
check_asm_space() {local dg_name=$1sqlplus -S "/ as sysdba" <<EOFset pagesize 0 feedback off verify off heading off echo offselect trunc(free_mb/1024) from v\$asm_diskgroup where name='$dg_name';
EOF
}# 添加数据文件
add_datafile() {local ts_name=$1sqlplus -S "/ as sysdba" <<EOFset pagesize 0 feedback off verify off heading off echo offalter tablespace $ts_name add datafile size 1G autoextend on next 100M;
EOF
}# 主流程
main() {check_envlog "===== 开始表空间检查 ====="# 使用临时文件替代进程替换tmp_file=$(mktemp)get_tablespace_usage > "$tmp_file"while IFS='|' read -r ts_name used_percent dg_list; do[ -z "$ts_name" ] && continuelog "警告:表空间 ${ts_name} 使用率 ${used_percent}% 超过阈值 ${VALT_PERCENT}%"# 处理多个磁盘组IFS=',' read -ra dg_array <<< "$dg_list"for dg_name in "${dg_array[@]}"; dofree_gb=$(check_asm_space "$dg_name")if [ $free_gb -ge $VFREE_SIZE ]; thenresult=$(add_datafile "$ts_name")if [ $? -eq 0 ]; thenlog "成功:表空间 ${ts_name} 在磁盘组 ${dg_name} 上添加数据文件"elselog "错误:表空间 ${ts_name} 添加数据文件失败 - $result"fielselog "错误:磁盘组 ${dg_name} 剩余空间不足 (剩余: ${free_gb}GB < 阈值: ${VFREE_SIZE}GB)"fidonedone < "$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中