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中