因为系统使用的报表系统是零几年的系统,查询报表后没有自动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的博客-优快云博客
PS:刚开始用sqluldr2导出数据库结果,但是在HP UNIX中sqluldr2使用有问题,改为用spool