
对于多人开发的单体项目来说,虽然我们同时在用的连接不会超过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掉,有人来找就让他们对系统夯住负责,然后限制用户的连接数。
不过这么 *** 作的风险还是不小的,自己掂量。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)