Как известно, в DB2 выключение какого либо процесса производится командой FORCE APPLICATION (handle_of_our_application). Где хэндл отключаемого приложения можно узнать несколькими методами:
-
через CLI:
“GET SNAPSHOT FOR APPLICATIONS ON OUR_BASE”
“lLIST APPLICATIONS FOR DB OUR_BASE”
-
посредством SQL-запроса:
“SELECT * FROM SYSIBMADM.APPLICATIONS”.
Хэндл выключаемого приложения находится, как правило, в столбце AGENT_ID.
Также есть универсальная команда для выключения всех приложений на инстанции:
“FORCE APPLICATION ALL”.
У меня на работе, на одной из инстанций, вертятся 2 базы. Как быть, если я хочу выключить все процессы на одной базе, не трогая их на другой? Команда “FORCE APPLICATION ALL” в данном случае не поможет, а каждый раз вводить “FORCE APPLICATION” для каждого процесса довольно муторно.
Как-то для этих целей я написал шелл-скрипт, которым частенько пользуюсь. Возможно кому-то из подписчиков коммьюнити он пригодится тоже. Удачи!
#! /bin/bash
#===================================================================
#
# Name : force_app.sh
# Description: The script turns off all conections to a certain
# database
# Usage : ./force_app.sh name_of_database
# Author : Peter Wilson (for “database administration” blog
# Date/time : DEC-09-2008 6.00 PM
#
#===================================================================
# Checking for the command-line parameter
if [ $# -lt "1" ]
then
echo "!!!!A database name is not pointed!!!!"
exit 0
fi
# Working with our database
db2 "connect to " $1
db2 "select agent_id from sysibmadm.SNAPAPPL"> app.txt
sed '/^$/d' app.txt > app1.txt
sed '/AGENT_ID/d' app1.txt > app.txt
sed '/-----/d' app.txt > app1.txt
sed '/selected/d' app1.txt > app.txt
sed 's/ //g' app.txt > app1.txt
mv app1.txt app.txt
awk '{print "force application (" $1 ");"}' app.txt > 1.sql
db2 "connect reset"
db2 -tvf 1.sql
rm *.{txt,sql}