Убить неактивные сессии! Параметр resource_limit

dbstalker, 11 июля

На одном подшефном сервере работаю нерадивые пользователи: подключаются к серверу с утреца и идут курить на несколько часиков. Научить их жизни не получается. Пришлось побороть их следующим образом:

Alter system set resource_limit=true scope=both;

ALTER PROFILE "DEFAULT" LIMIT IDLE_TIME 15;

Всем пользователям назначили этот профиль.Таким образом ограничили «курение» 15 минутами. Злостные «курильщики» получают сообщение: ORA-02396: exceeded maximum idle time, please connect again

6 комментариев

Прокоментировать

Anonymous
17 июля 2008 г. в 14:36

Спасибо за напоминание.

dbstalker
17 июля 2008 г. в 14:58

Всегда рады!

denix1
19 июля 2008 г. в 13:50

стоило бы дополнить, что
Злостные «курильщики» получают сообщение: ORA-02396 только при попытке чего-то там выполнить
в сессии, к которой применились эти ресурсний лимиты,
а вот еще не пытается ничего делать(комп перегрузился аварийно)
то сессия будет себе жить дальше - ни живая ни мертвая

viman
30 сентября 2008 г. в 08:46

Да, такие сессии все равно, к сожалению, продолжают занимать ресурсы. Для принудительного их уничтожения достаточно запускать периодически через системный планировщик подобный скрипт(для Linux):
#!/bin/bash
# kill Oracle sessions, marked as 'SNIPED' or 'KILLED'

export DISPLAY=localhost:0.0
export LANG=
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9ir2
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
export ORACLE_SID=asr
export PATH=$PATH:$ORACLE_HOME/bin:/usr/local/bin:$ORACLE_BASE/admin/$ORACLE_SID/scripts/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/ctx/lib

ORACLEUSER_NAME=oracle
username=`id -nu`
if [ "$username" != "$ORACLEUSER_NAME" ]
then
echo
echo
echo "###################################################"
echo "Warning! Only $ORACLEUSER_NAME user can run this script!"
echo "Your login - $username. Exit"
echo "###################################################"
echo
echo
exit
fi


tmpsql=/tmp/$$.sql
tmpsh=/tmp/$$.sh

echo; echo; echo
echo '=============================================='
echo -n 'Start killing sniped session at ';date
echo 'set heading off' > $tmpsql
echo 'set feedback off' >> $tmpsql
echo 'set linesize 200' >> $tmpsql
echo 'set trimspool on' >> $tmpsql
echo 'column cmd format a70' >> $tmpsql
echo "spool $tmpsh" >> $tmpsql
echo "SELECT 'kill -9 '||p.spid" >> $tmpsql
echo 'FROM v$session s, v$process p' >>$tmpsql
echo 'WHERE ((s.username IS NOT NULL)' >> $tmpsql
echo "AND (NVL (s.osuser, 'x') <> 'SYSTEM')" >> $tmpsql
echo "AND (s.TYPE <> 'BACKGROUND')" >> $tmpsql
echo "and (s.STATUS in ('SNIPED','KILLED')))" >> $tmpsql
echo "AND (p.addr(+) = s.paddr)" >> $tmpsql
echo "and p.SPID is not null" >> $tmpsql
echo '/' >> $tmpsql
echo 'spool off' >> $tmpsql
echo 'exit' >> $tmpsql

sqlplus ' / as sysdba' @$tmpsql
#run pack script
/bin/bash $tmpsh
rm -f $tmpsh
rm -f $tmpsql
echo -n 'Finish killing sniped session at ';date

viman
30 сентября 2008 г. в 08:52

Ой. :) с линукса перевод строки не воспринялся, исправляюсь:
#!/bin/bash
# kill Oracle sessions, marked as 'SNIPED' or 'KILLED'
export DISPLAY=localhost:0.0
export LANG= export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9ir2
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
export ORACLE_SID=asr
export PATH=$PATH:$ORACLE_HOME/bin:/usr/local/bin:$ORACLE_BASE/admin/$ORACLE_SID/scripts/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/ctx/lib
ORACLEUSER_NAME=oracle
username=`id -nu`
if [ "$username" != "$ORACLEUSER_NAME" ]
then
echo "###################################################"
echo "Warning! Only $ORACLEUSER_NAME user can run this script!"
echo "Your login - $username. Exit"
echo "###################################################"
echo
exit
fi
tmpsql=/tmp/$$.sql
tmpsh=/tmp/$$.sh
echo; echo '=============================================='
echo -n 'Start killing sniped session at ';date
echo 'set heading off' > $tmpsql
echo 'set feedback off' >> $tmpsql
echo 'set linesize 200' >> $tmpsql
echo 'set trimspool on' >> $tmpsql
echo 'column cmd format a70' >> $tmpsql
echo "spool $tmpsh" >> $tmpsql
echo "SELECT 'kill -9 '||p.spid" >> $tmpsql
echo 'FROM v$session s, v$process p' >>$tmpsql
echo 'WHERE ((s.username IS NOT NULL)' >> $tmpsql
echo "AND (NVL (s.osuser, 'x') <> 'SYSTEM')" >> $tmpsql
echo "AND (s.TYPE <> 'BACKGROUND')" >> $tmpsql
echo "and (s.STATUS in ('SNIPED','KILLED')))" >> $tmpsql
echo "AND (p.addr(+) = s.paddr)" >> $tmpsql
echo "and p.SPID is not null" >> $tmpsql
echo '/' >> $tmpsql
echo 'spool off' >> $tmpsql
echo 'exit' >> $tmpsql
sqlplus ' / as sysdba' @$tmpsql
/bin/bash $tmpsh
rm -f $tmpsh
rm -f $tmpsql
echo -n 'Finish killing sniped session at ';date

viman
30 сентября 2008 г. в 08:54

Опять все плохо... :(. Ну кому надо, тот разберется и поймет.

 

Новый комментарий

Я не спамер: введите суму 3+5



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Товары для взрослых
24 мая, 1 ответа
Выделенный сервер
23 мая, 3 ответа