用法:
1、chmod +x find_lock.sh
2、需要两个参数:find_lock.sh dbname locked_tabname
#!/bin/bash
##################################################################
# Filename: find_lock.sh
# Function: Auto Find The Session That Lock Table.
# Write by: Uncle.Cui
# Version : 0.8 update date: 2020-02-19
##################################################################
if [ $# -ne 2 ]; then
echo "Usage: "
echo "#############################################"
echo "monitor_lock_table.sh dbname locked_tabname"
echo "#############################################"
exit
fi
dbname=$1
tabname=$2
s_name=`echo $0|awk -F '/' '{print $NF}'`
ps aux |grep "$s_name" |grep -vE "$$|grep">/tmp/lock.tabname
p_n=`wc -l /tmp/lock.tabname|awk '{print $1}'`
if [ $p_n -gt 0 ]
then
exit
fi
get_ses()
{
part=$1
echo "awk 'BEGIN {RS=\"\\n\\n+\";ORS=\"\\n\\n\"} /"$part"/ {print \$0}' .opn|grep rstcb|awk '{print \$2}'|awk -F'x' '{print \"onstat -u|grep \"\$2}'|sh|awk '{print \$3}'" >> get_awk.sh
}
kill_ses()
{
read -p 'will you kill the session(y|Y or n|N): ' c
if [ -z "$c" ]
then
exit 1
fi
if [ $c == "y" -o $c == "Y" ]
then
cat .user_thread|while read uthd;
do
sid=`onstat -u |grep $uthd|awk '{print $3}'`
onmode -z $sid
done
else
exit 1
fi
}
oncheck -pt $dbname:$tabname|grep 'Partition partnum'|awk '{print $3}' > .partnum
[ -f .partnum_hex ] && cat /dev/null > .partnum_hex
[ -f .partnum_in_lock ] && cat /dev/null > .partnum_in_lock
cat .partnum|while read line;
do
partn_hex=`printf "%x\n" $line`
echo $partn_hex >> .partnum_hex
onstat -k |grep $partn_hex|awk '{print $3}'|sort -u >> .partnum_in_lock
done
#cat /dev/null > .partnum_in_lock
cat .partnum_in_lock|sort -u > .user_thread
userthread=`cat .user_thread|wc -l`
if [ $userthread -eq 0 ]
then
onstat -g opn > .opn
cat .partnum_hex|while read hexpn;
do
get_ses $hexpn
done
chmod +x get_awk.sh
./get_awk.sh >> get_ses.sh
cat get_ses.sh|sort -u|awk '{print "onstat -g ses "$1}'|sh
cat get_ses.sh|sort -u|awk '{print "onmode -z "$1}'|sh
rm -rf get_ses.sh get_awk.sh
else
cat .user_thread|while read uthread;
do
onstat -u |grep $uthread|awk '{print "onstat -g ses "$3}'|sh;
echo "------------------------------------------------------------------------------------";
done
kill_ses
fi