公司系统缓慢-分析数据库CPU过高原因-连接数

前段时间,公司系统突然异常缓慢,通过监控看到连接数突然陡增,并且不释放,以下是我们的处理步骤:

1、分析CPU过高是否由系统负载高导致

2、CPU过高可能与读写操作过高有关,是否有程序发送大量请求数据库导致连接数过高

3、检查慢SQL是否过多,导致很多链接时间过长,导致链接不释放。这里可以通过show PROCESSLIST;


4、在show PROCESSLIST;中意外发现有大量的SLEEP的链接,并且每个达到上万秒,通过手动kill {id}的方式,把这些链接kill掉解决了这个难题(最笨的方法,应以尽快恢复服务为主,下面是正统的解决办法)。

那么造成sleep的原因,有三个,下面是mysql手册给出的解释:

1.客户端程序在退出之前没有调用mysql_close().
2.客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器.
3.客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了.
原文请见下面:
1 The client program did not call mysql_close() before exiting.
2 The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server.
3 The client program ended abruptly in the middle of a data transfer

其中1和3并不好排查,关于2建议手动设置一下超时时间,通过下面语句可进行调整:

    mysql> set global wait_timeout=10;  
    mysql> show global variables like '%timeout';  

另,wait_timeout默认情况下wait_timeout的值是8小时的时间,你可以改成1个小时,或半个小时。这样mysql会更快的杀死死连接。防止连接的数量越多,对你服务器的压力越大。实际上那些连接都是冗余的,把它们尽快杀死才是上策。

下面是查看oracle数据库的基础命令

1、查看当前的数据库连接数
 select count(*) from v$process ;    --当前的数据库连接数
2、数据库允许的最大连接数
select value from v$parameter where name ='processes';  --数据库允许的最大连接数
3、修改数据库最大连接数
alter system set processes = 300 scope = spfile;  --修改最大连接数:
5、查看当前有哪些用户正在使用数据
select osuser, a.username, cpu_time/executions/1000000||'s', b.sql_text, machine
from v$session a, v$sqlarea b
where a.sql_address =b.address
order by cpu_time/executions desc;  --查看当前有哪些用户正在使用数据
6、 --当前的session连接数
 select count(*) from v$session  --当前的session连接数
7、当前并发连接数
 select count(*) from v$session where status='ACTIVE'; 

8、查看用户或角色系统权限(直接赋值给用户或角色的系统权限):
select * from dba_sys_privs;
select * from user_sys_privs;
9、查看角色(只能查看登陆用户拥有的角色)所包含的权限
select * from role_sys_privs;
10、查看用户对象权限:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
11、查看所有角色:
select * from dba_roles;
原文地址:https://www.cnblogs.com/tanxiaojun/p/11986044.html