MySQL如何杀掉无用连接?

MySQL如何杀掉无用连接?,第1张

错误“Too many connections”。平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后重启数据库。但是生产服务器上数据库又不能随便重启。没办法,只好想办法手动去释放一些没用的连接。登陆到MySQL的提示符下,数据show processlist这个命令,可以得到所以连接到这个服务器上的MySQL连接:mysql>show processlist+---------+------+---------------------+---------+---------+------+-------+-------------------+| Id | User | Host| db | Command | Time | State | Info |+---------+------+---------------------+---------+---------+------+-------+-------------------+| 1180421 | ur | 202.103.96.68:49754 | test1 | Sleep |1 | | NULL || 1180427 | ur | 202.103.96.68:55079 | test2 | Sleep |1 | | NULL || 1180429 | ur | 202.103.96.68:55187 | testdba | Sleep |0 | | NULL || 1180431 | ur | 202.103.96.68:55704 | testdba | Sleep |0 | | NULL || 1180437 | ur | 202.103.96.68:32825 | test1 | Sleep |1 | | NULL || 1180469 | ur | 202.103.96.68:58073 | testdba | Sleep |0 | | NULL || 1180472 | ur | 83.136.93.131:47613 | test2 | Sleep |8 | | NULL || 1180475 | root | localhost | NULL| Query |0 | NULL | show PROCESSLIST |+---------+------+---------------------+---------+---------+------+-------+-------------------+8 rows in set (0.00 sec)mysql>然后,你可以看到像上面这样的MySQL数据连接列表,而且每一个都会有一个进程ID号(在上表的第一列)。我们只要输入这样的命令:mysql>kill 1180421Query OK, 0 rows affected (0.00 sec)mysql>其中1180421为你在进程列表里找到并且要杀掉的进程号。产生这种问题的原因是:连接数超过了 MySQL 设置的值,与 max_connections 和 wait_timeout 都有关系。wait_timeout 的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大。解决方法:修改MySQL配置文件/etc/my.cnf,设置成max_connections=1000,wait_timeout=5。如果没有此项设置可以自行添加,修改后重启MySQL服务即可。要不经常性报此错误,则要对服务器作整体性能优化注:为了防止发生too many connections时候无法登录的问题,mysql manual有如下的说明:mysqld actually allows max_connections+1 clients to connect. The extra connection is reserved for use by accounts that have the SUPER privilege. By granting the SUPER privilege to administrators and not to normal users (who should not need it), an administrator can connect to the server and use SHOW PROCESSLIST to diagnose problems even if the maximum number of unprivileged clients are connected.因此, 必须只赋予root用户的SUPER权限,同时所有数据库连接的帐户不能赋予SUPER权限。前面说到的报错后无法登录就是由于我们的应用程序直接配置的root用户 总结,解决问题的最终方法:1.修改配置文件/etc/my.cnf,调整连接参数2.检查程序代码,对于没有关闭的链接及时进行关闭

不是要删掉一些连接

而是要将最大连接数设置的小一些 起到保护后端服务器的作用

查看当前最大连接数:

show variables like '%max_connections%'

修改最大连接数应该编辑 my.cnf 文件里面的 max_connections 值

改完之后需要重启才能生效

插入数据

insert into 表名(字段) values(‘数据’);

insert into 表名1(name,age) select name,age from 表2; #表2 数据信息复制到表1

修改数据

update 表名 set '字段'='数据';    #修改数据

delect from 表名 where 字段=值;   #删除数据

truncate table 表名;           #清空所有数据 且无法恢复

DQL (数据查询语言,用来查询数据)

select 要查询字段 from 表名 [where 满足条件];

[group by 分组依据]

[order by 排序依据]

[limit 限定输出结果]

select * from 表名;         #查询 表 所有数据

select 字段 字段 from 表名;      #查询指定字段数据

select st.name,st.age,th.name,th.age from st,th            #查询一个或多个  表中的数据

SELECT 字段名 FROM 表名 WHERE 条件1 OR 条件2 [...OR 条件n]

例:SELECT * FROM students WHERE age<20 OR education!='大专'#查询年龄小于20或 者学历不等于大专的学生信息

SELECT 字段名 FROM 表名 WHERE 条件1 AND 条件2 [...AND 条件n]

例:SELECT * FROM students WHERE age>22 AND education='大专'# 查询年龄大于22 且学历为大专的学生信息

select 字段 from 表名 where age in (12,17,23)              #数据在指定 数据 里面

select 字段 from 表名 where age between 23 and 28       #数据在23-28 之间

select * from 表名 order by 字段名;                      #排序,升序

select 字段 from 表名 order by desc                        #   字段降序

select 字段1,字段2…… from 表名 group by  分组依据字段;          #每个字段只显示一条

例:SELECT id,sname,age,phone,place,GROUP_CONCAT(age,place) FROM students GROUP BY age,place#查询学生信息,根据age,place分组并显示每一组的记 录

select  distinct  字段 from  表名;                          #去除结果重复行

例:SELECT DISTINCT age FROM students# 查询学生的年龄段情况

selcet 字段1,字段2,group_concat(分组依赖字段名) from 表名 group by 分组依赖字段名;    #查询每个组中记录数量,显示出来(使用关键字GROUP BY与GROUP_CONCAT()函数一起使用,可以将每个组中的记录数量都显 示出来)

例:selcet id,sname,age,phone,GROUP_CONCAT(age) FROM students GROUP BY age# 查询学生id,姓名,年龄,电话,根据age分组并显示每一组的记录

SELECT 字段名 FROM 表名 [其他条件] LIMIT int,int参数1是开始读取的第一条记录的 编号,参数2是要查询记录的个数

例:SELECT * FROM students ORDER BY age LIMIT 0,5# 查询学生信息,根据age 排序从第0位开始显示,只显示5条

select 字段名 from 表名where字段名 regexp '匹配方式'

(^匹配以特定字符或 字符串开头的记录,

$匹配以特定字符或 字符串结尾的记录

[^字符集 合]匹配除“字符集合”以 外的任意一个字符

S1|S2|S3匹配S1 S2 S3中 的任意一个字符串

字符串{N }匹配字符串出现N次

字符串 {M,N}匹配字符串出现至 少M次,最多N次)

聚合函数查询

select count(字段名) from 表名           #对于除"*"以外的任何参数,返回所选择集合中非NULL值的行的数目;对于参数“*”,返回选择集 合中所有行的数据,包含NULL值的行

例:SELECT COUNT(*) FROM students

select sum(字段名) from 表名          #表中某个字段取值的总和

select avg(字段名) from 表名;       #表中某个字段取值的平均值

select max(字段名) from 表名;        #表中某个字段取值的最大值

select min(字段名) from 表名;         #表中某个字段取值的最小值

连接查询

a.内连接:列出数据表中与连接条件相匹配的数据行,组合成新记录【只有满足条件的记录才出现在查询结 果】 内连接的最常见的例子是相等连接,也就是连接后的表中的某个字段与每个表中的都相同

select 字段名1,字段名2  from 表名1 inner join 表名2 where 连接条件

例:select s.name,d.dname from staff s inner join department d WHERE s.dpid = d.id# 连接员工表的dpid字段和部门表的id字段,并查询员工姓名和部门名称

b.外连接:与内连接不同,外连接是指使用OUTER JOIN关键字将两个表连接起来。外连接生成的结果集不仅 包含符合连接条件的行数据 ,而且还包含左表(左外连接时的表) 右表(右外连接时的表)或 两边连接表(全外连接时的表)中所有的数据行。

select 字段名称 from 表名1 LEFT|RIGHT join 表名2 on 表名1.字段名1 = 表名2.字段名2

例:select s.name,d.dname FROM staff s LEFT JOIN department d ON s.dpid = d.id#连接员工表的dpid字段和部门表的id字段,并查询员工姓名和部门名称,如果右表中没有对应的 连接数据,会自动添加NULL值

例:SELECT s.name,d.dname FROM staff s RIGHT JOIN department d ON s.dpid = d.id# 连接员工表的dpid字段和部门表的id字段,并查询员工姓名和部门名称,如果左表中没有对应 的连接数据,会自动添加NULL值

例:SELECT 字段名1,字段名2 FROM 表名1,表名2 WHERE 连接条件 AND 限制条件例:SELECT s.name,d.dname FROM staff s,department d WHERE s.dpid = d.id AND s.dpid>1# 查询员工姓名和部门名称,条件是员工表的dpid字段与部门表中的id字段相等,并且dpid大于1

合并查询结果

select 字段名 from  表名 UNION select 字段名  from 表名   #关键字UNION是将所 有的查询结果合并到一起,并且去除相同记录

例:SELECT dpid FROM staff UNION SELECT id FROM department# 查询员工表dpid与部门表id,如果有重复数据,只显示一次

select 字段名 drom 表名 UNION ALL select 字段名from表名   #关键字UNION ALL 则只是简单地将结果合并到一 起

例:SELECT dpid FROM staff UNION ALL SELECT id FROM department# 查询员工表dpid与部门表id,全部显示


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

原文地址: http://outofmemory.cn/zaji/6195133.html

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

发表评论

登录后才能评论

评论列表(0条)

保存