在日常的数据库管理中,自动生成和管理 AWR (Automatic Workload Repository) 报告是非常重要的。AWR 报告提供了丰富的性能数据和统计信息,对于分析数据库性能问题非常有帮助。本文将介绍一个 Shell 脚本,它可以每小时自动生成一次 AWR 报告,并删除七天前的旧报告。如果快照间隔是半小时,则每半小时生成一次报告。
Oracle 的 AWR 报告能够记录数据库的性能数据,包括系统负载、SQL 统计信息、等待事件等。定期生成和保存 AWR 报告有助于我们在问题发生时能够迅速回溯和分析。然而,手动生成 AWR 报告并非长久之计,因此我们需要一个自动化的解决方案。
# shell脚本,awr_report.sh 这是每1小时生成一次awr报告的脚本,并删除7天前的awr
# 如果快照是半小时的, 则crontab换成半小时一次
mkdir -p /home/oracle/script
cat << 'EOF' > /home/oracle/script/awr_report.sh
#!/bin/sh
source ~/.bash_profile
if [[ -n "$1" ]]; then
ORACLE_SID=$1
fi
if [[ "$ORACLE_SID" == "" ]]; then
echo "Error: ORACLE_SID is missing."
exit 1
fi
mkdir -p /home/oracle/$ORACLE_SID
WORKPATH=/home/oracle/$ORACLE_SID
AWR_FORMAT=html
NUM_DAYS=2
MAX_SNAP_ID=$($ORACLE_HOME/bin/sqlplus -S / as sysdba << ENDSQL
set heading off trimspool on feedback off timing off
SELECT trim(max(SNAP_ID)) FROM DBA_HIST_SNAPSHOT;
ENDSQL
)
export MAX_SNAP_ID
MIN_SNAP_ID=$(expr $MAX_SNAP_ID - 1)
export MIN_SNAP_ID
datetime=$(date +%Y%m%d%H)
export datetime
AWR_LOG=$WORKPATH/AWR_${ORACLE_SID}_${datetime}.html
export AWR_LOG
echo -e "$AWR_FORMAT\n$NUM_DAYS\n$MIN_SNAP_ID$MAX_SNAP_ID\n$AWR_LOG\n" | ($ORACLE_HOME/bin/sqlplus -S / as sysdba @?/rdbms/admin/awrrpt.sql) >>/home/oracle/script/$ORACLE_SID_awrrpt.log 2>&1
find /home/oracle/$ORACLE_SID/ -name '*.html' -mtime +7 -exec rm -f {} \;
EOF
chmod +x /home/oracle/script/awr_report.sh
# 替换下面的SID为实际SID
(crontab -l 2>/dev/null; echo "10 */1 * * * /home/oracle/script/awr_report.sh SID >>/home/oracle/script/awr.log 2>&1") | crontab -
总结
通过上述脚本和定时任务设置,我们可以轻松实现 Oracle 数据库 AWR 报告的自动化生成和管理。这不仅能够提高工作效率,还能确保我们及时掌握数据库的性能情况并进行相应的优化和调整。
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」
文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




