在之前的文章DB2活动日志满的原因、分析、处理与避免中,讲述如何避免日志满中有提到一种建议:可以写脚本,以固定的间隔抓取database snapshot中的Appl id holding the oldest transaction,如果长时间不发生变化(比如2天),就Force掉。
最近尝试写了一个脚本,实现这个功能,脚本需要两个参数,第一个是数据库的名子;第二个是检查的间隔,如果两次检查均为同一个应用hold住首个活动日志(最老活动日志),并抓取一下这个应用的快照,然后把它force掉:
#!/bin/bash # 脚本的目地是每隔固定的时间检查一下hold住最老日志的应用,如果这次检查和结果和上次一样,说明这个应用hold住首个活动日志很久了,可以force掉 # 具体工作的方式是:先每隔2秒种检查一次,如果发现没有应用hold住首个活动日志,则开始下一次循环;否则,过INTERVAL秒之后,再次检查,如果两者相同,则force掉。 usage() { echo "Wrong parameter,Usage: check.sh DBNAME INTERVAL" exit 1 } if [ $# -ne 2 ]; then usage fi DBNAME=$1 INTERVAL=$2 appOldest=`db2 get snapshot for db on $DBNAME | grep -i oldest | awk '{print $NF}'` while [ 1 ] do curApp=`db2 get snapshot for db on $DBNAME | grep -i oldest | awk '{print $NF}'` if [ -z "$curApp" ]; then #echo "There is no app holding log now,will check 2 seconds later" sleep 2 continue fi if [ "$appOldest" = "$curApp" ]; then db2 "get snapshot for application agentid $appOldest" > $appOldest.snapshot db2 "force application ($appOldest)" fi appOldest=$curApp; sleep $INTERVAL done原文链接:https://www.f2er.com/bash/391408.html