Oracle session数过多导致数据库查询变慢,以至于网站贼卡的解决办法

客户反映说网站卡,开一个页面都进不去。我打开Oracle一看,500多的 session 数,得把 session 降下来。(确保SQL语句已经优化,索引啥的都弄了,没有其它程序占用大量资源)

1. 强行断开全部非 SYS 的 session

  1. 执行一条语句

    SELECT 'ALTER SYSTEM DISCONNECT SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session WHERE username not like '%SYS%';
    
  2. 复制执行结果

  3. 执行复制的结果

原理呢:

因为删掉一个 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;

你可能感兴趣的:(数据库,oracle,数据库,sql)