linux.oracle释放链接数

linux.oracle释放链接数,第1张

MySQL数据库的默认最大连接数是:100,

对于多人开发的单体项目来说,虽然我们同时在用的连接不会超过10个,理论上100 绰绰有余,但是除了我们正在使用的连接以外,还有很大一部分 Sleep 的连接,这个才是真正的罪魁祸首。

分析到了问题的根源,我们就需要对症下药,依次解决:

修改MySQL最大连接数量

首先查看当前 Mysql 最大连接数量是多少:

show variableslike'%max_connections%'

这里我已经修改过了,所以是 1000,没有改过的童鞋应该还是 100,

然后查看从这次 mysql 服务启动到现在,同一时刻并行连接数的最大值:

show statuslike'Max_used_connections'

对于 MySQL 的最大连接数设置,在首次配置的时候设置一个较大的数值,以后在使用的过程中,周期的查询 Max_used_connections 然后根据他的值和服务器的性能确定一个最适合当前项目的最大连接数

最大连接数的修改有两种方式

使用 sql 语句(立即生效,但服务器重启后失效):

setglobalmax_connections = 1000

1修改 /etc/my.cnf.添加 max_connections = 1000 永久有效。重启后生效

但更改最大连接数只能从表面上解决问题,随着我们开发人员的增多,Sleep 连接也会更多,到时候万一又达到了 1000 的上限,难道我们又得改成 10000 吗?这显然是非常不可取的。所以我们不仅要治标,还要治本。杀掉多余的 Sleep 连接就是治本

杀掉Sleep连接

我们可以通过 show_processlist 命令来查看当前的所有连接状态

可以发现, Sleep 的连接占了绝大多数。

MySQL 数据库有一个属性 wait_timeout 就是 sleep 连接最大存活时间,默认是 28800 s,换算成小时就是 8 小时,我的天呐!这也太长了!严重影响性能。相当于今天上班以来所有建立过而未关闭的连接都不会被清理。

执行命令:

showglobalvariableslike'%wait_timeout'

我们将他修改成一个合适的值,这里我改成了 250s。当然也可以在配置文件中修改,添加 wait_timeout = 250。这个值可以根据项目的需要进行修改,以 s 为单位。我在这里结合 navicat 的超时请求机制配置了 240s。

执行命令:

setglobalwait_timeout=250

Oracle服务器连接数过多会当掉,把连接数过多的客户机网线拔出后,在远程Oracle上依然还会保留此用户的连接数,久久不能释放,上网查了下可以以下面方法解决。

通过profile可以对用户会话进行一定的限制,比如IDLE时间。

将IDLE超过一定时间的会话断开,可以减少数据库端的会话数量,减少资源耗用。

使用这些资源限制特性,需要设置resource_limit为TRUE:

[oracle@test126 udump]$ sqlplus “/ as sysdba”

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 13 07:58:21 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning and Data Mining options

SQL>show parameter resource

NAMETYPEVALUE

———————————— ———– ——————————

resource_limit booleanTRUE

resource_manager_planstring

该参数可以动态修改:

SQL>alter system set resource_limit=true

System altered.

数据库缺省的PROFILE设置为:

SQL>SELECT * FROM DBA_PROFILES

PROFILE RESOURCE_NAMERESOURCE LIMIT

——————– ——————————– ——– —————

DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED

DEFAULT SESSIONS_PER_USERKERNEL UNLIMITED

DEFAULT CPU_PER_SESSION KERNEL UNLIMITED

DEFAULT CPU_PER_CALLKERNEL UNLIMITED

DEFAULT LOGICAL_READS_PER_SESSIONKERNEL UNLIMITED

DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED

DEFAULT IDLE_TIMEKERNEL UNLIMITED

DEFAULT CONNECT_TIMEKERNEL UNLIMITED

DEFAULT PRIVATE_SGA KERNEL UNLIMITED

DEFAULT FAILED_LOGIN_ATTEMPTSPASSWORD 10

DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED

PROFILE RESOURCE_NAMERESOURCE LIMIT

——————– ——————————– ——– —————

DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED

DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED

DEFAULT PASSWORD_VERIFY_FUNCTIONPASSWORD NULL

DEFAULT PASSWORD_LOCK_TIME PASSWORD UNLIMITED

DEFAULT PASSWORD_GRACE_TIME PASSWORD UNLIMITED

16 rows selected.

创建一个允许3分钟IDLE时间的PROFILE:

SQL>CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 3

Profile created.

新创建PROFILE的内容:

SQL>col limit for a10

SQL>select * from dba_profiles where profile=’KILLIDLE’

PROFILERESOURCE_NAMERESOURCE LIMIT

—————————— ——————————– ——– ———-

KILLIDLE COMPOSITE_LIMIT KERNEL DEFAULT

KILLIDLE SESSIONS_PER_USERKERNEL DEFAULT

KILLIDLE CPU_PER_SESSION KERNEL DEFAULT

KILLIDLE CPU_PER_CALLKERNEL DEFAULT

KILLIDLE LOGICAL_READS_PER_SESSIONKERNEL DEFAULT

KILLIDLE LOGICAL_READS_PER_CALL KERNEL DEFAULT

KILLIDLE IDLE_TIMEKERNEL 3

KILLIDLE CONNECT_TIMEKERNEL DEFAULT

KILLIDLE PRIVATE_SGA KERNEL DEFAULT

KILLIDLE FAILED_LOGIN_ATTEMPTSPASSWORD DEFAULT

KILLIDLE PASSWORD_LIFE_TIME PASSWORD DEFAULT

PROFILERESOURCE_NAMERESOURCE LIMIT

—————————— ——————————– ——– ———-

KILLIDLE PASSWORD_REUSE_TIME PASSWORD DEFAULT

KILLIDLE PASSWORD_REUSE_MAX PASSWORD DEFAULT

KILLIDLE PASSWORD_VERIFY_FUNCTIONPASSWORD DEFAULT

KILLIDLE PASSWORD_LOCK_TIME PASSWORD DEFAULT

KILLIDLE PASSWORD_GRACE_TIME PASSWORD DEFAULT

16 rows selected.

测试用户:

SQL>select username,profile from dba_users where username=’EYGLE’

USERNAME PROFILE

—————————— ——————–

EYGLE DEFAULT

修改eygle用户的PROFILE使用新建的PROFILE:

SQL>alter user eygle profile killidle

User altered.

SQL>select username,profile from dba_users where username=’EYGLE’

USERNAME PROFILE

—————————— ——————–

EYGLE KILLIDLE

进行连接测试:

[oracle@test126 admin]$ sqlplus eygle/eygle@eygle

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 13 08:07:13 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning and Data Mining options

SQL>select username,profile from dba_users where username=’EYGLE’

USERNAME PROFILE

—————————— ——————————

EYGLE KILLIDLE

当IDLE超过限制时间时,连接会被断开:

SQL>select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual

TO_CHAR(SYSDATE,’YY

——————-

2006-10-13 08:08:41

SQL>select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual

select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual

*

ERROR at line 1:

ORA-02396: exceeded maximum idle time, please connect again

释放连接只能是让一些连接的进程断开连接。

查询哪个user的连接数最多,先跟他们的用户说,不能连接这么多的进程,让他们释放一些,如果释放了,系统正常了,那么就限制每个用户连接数,不让他们连接这么多。

如果不释放,你就在 *** 作系统层面把他们那些进程kill掉,有人来找就让他们对系统夯住负责,然后限制用户的连接数。

不过这么 *** 作的风险还是不小的,自己掂量。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10080680.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存