oracle定时清理未释放的spid脚本

因为系统使用的报表系统是零几年的系统,查询报表后没有自动commit功能,所以会存在使用dblink后session一直未释放的情况,会造成数据库锁。

当锁数量达到40+时数据库服务器的CPU资源占满,影响系统的使用。

因此,写一个定时清理脚本,当来自报表那台服务器ip的查询超过200分钟时,就kill掉。

首先使用oracle的spool工具导出对应的spid进程号,然后脚本中kill掉。

建立spool.sql脚本

set colsep ','
set newpage none
set heading off
set echo off
set feedback off
set pagesize 0
set termout off
set trimout on
set trimspool on
spool /home/oracle/export_txt/spid.csv
SELECT
p.spid
  FROM v$session s, v$process p
 WHERE (s.status = 'ACTIVE')
   AND ((s.username IS NOT NULL) AND (NVL(s.osuser, 'x') <> 'SYSTEM') AND
       (s.TYPE <> 'BACKGROUND'))
   AND (p.addr(+) = s.paddr)
   AND s.USERNAME <> 'SYS'
   and s.client_info='logon XX.XX.XX.XX'
   and s.last_call_et / 60 >200;
spool off

 编写清理sh脚本kill_spid.sh

设置定时清理报表SQL未释放连接的任务:
#!/bin/sh
ORACLE_SID=IOM
sqlplus / as sysdba@IOM <<EOF
@/home/oracle/export_txt/spool.sql
EOF
FILENAME=/home/oracle/export_txt/spid.csv
DATE=`date "+%Y-%m-%d %H:%M:%S"`
echo "Clear spid on $DATE"
for line in `cat $FILENAME`
do
 echo $line
 kill -9 $line
done

设置定时任务crontab 

0 */12 * * * sh /home/oracle/export_txt/kill_spid.sh >> /home/oracle/export_txt/kill_spid.log   

有关spool的内容参考文章:

oracle数据库SPOOL缓冲池导出数据,SQLLDR 导入数据_oracle spool导出数据_lichuanjai的博客-CSDN博客

PS:刚开始用sqluldr2导出数据库结果,但是在HP UNIX中sqluldr2使用有问题,改为用spool

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大宇进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值