客户反映说网站卡,开一个页面都进不去。我打开Oracle一看,500多的 session 数,得把 session 降下来。(确保SQL语句已经优化,索引啥的都弄了,没有其它程序占用大量资源)
1. 强行断开全部非 SYS 的 session
-
执行一条语句
SELECT 'ALTER SYSTEM DISCONNECT SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session WHERE username not like '%SYS%';
-
复制执行结果
-
执行复制的结果
原理呢:
因为删掉一个 session 的语句是
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;
所以,我们需要找到需要清除的 session 的 sid,serial#
关于清 session 的 sql 语句
# 1. IMMEDIATE 很重要,不加这个不会立即释放 session
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
# 2. IMMEDIATE 很重要,不加这个不会立即中断会话
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;
杀掉全部 session 只是临时解决办法,想要永久解决?升级硬件吧!不想升级就看下面!
2. 设置 session 最长连接时间
不升级硬件就只能设置 session 的最长连接时间了,到时间就断,事务回滚,虽然会出现问题,但是大部分是没问题的。
PROFILE 规则的修改,Oracle 会有个默认的 PROFILE 叫 DEFAULT,你的用户大概率对应这个(你没改过的话)
所以,我们最好不要改 DEFAULT
我们需要控制 IDLE TIME(空闲时间),如果控制空闲时间都不好使那就控制 CONNECT TIME(连接时间)
单位都是分钟,值是整数,也就是最少1分钟
在这之前我们需要开启 resource_limit
# 查看是否开启
show parameter resource_limit;
# 开启 resource_limit
alter system set resource_limit=true;
我们新建一个 PROFILE 规则
create profile NEW_PROFILE
limit
idle_time 1
connect_time 2;
给你的用户指定 PROFILE 规则
alter user MY_USER profile NEW_PROFILE;
就可以了
下面是相关 sql 语句
# 修改 PROFILE 规则
alter profile NEW_PROFILE limit idle_time 1;
# 删除 PROFILE # 已经分配的 PROFILE 必须加 cascade
drop profile NEW_PROFILE;
drop profile NEW_PROFILE cascade;
# 查看当前 session (数量)
select * from v$session;
select count(*) from v$session;
# 查看 PROFILE
select * from dba_profiles order by profile;
# 查看用户对应的 profile
select * from dba_users;