目录
1、Oracle
1.1、数据库内操作
--单实例:
select 'alter system kill session '''||s.sid||','||s.SERIAL#||''' immediate;' from v$session s
where s.status='INACTIVE' --状态为非活跃
and s.USERNAME= 'ZZZ' --用户为ZZZZ
s.type<>'BACKGROUND' --不为oracle后台进程
and program not like '%(J0%' --不为oracle的JOB进程
order by s.LOGON_TIME asc,sql_exec_start asc;
1.2、操作系统中操作(要求登录到数据库主机)
## kill掉所有local=no的非本地连接进程
ps -ef|grep -v grep|grep LOCAL=NO|awk '{print $2}'|xargs kill -9
2、SQL Server:
--kill 被阻塞会话
select 'kill '+cast(spid as varchar) FROM sys.sysprocesses sp
where sp.blocked !=0 and sp.spid != sp.blocked and loginame='XXX';
3、PG:
3.1、数据库内操作:
方案一,较保守、风险低,但是针对高并发的系统效果不好。因为kill的速度慢,跟不上再次上来的会话。
SELECT 'select pg_terminate_backend('||pid||');' FROM pg_stat_activity
WHERE pid <> pg_backend_pid() -- 不kill掉自己的进程
and datname='ZZZ' --涉及到的数据库名
and usename='ZZZ' --涉及到的用户名
and query like '%ZZZ%' – 涉及到的语句
order by (now()-query_start) desc – 根据执行时间长短排序,先kill执行时间长的
;
方案二,可以针对高并发系统,会话上来很快,且kong端虽然限流但是还是没有限制住(可能是开发没找对接口,报给运维限制了kong,但是还是有大量的会话进来)
--1. 先确认pid对应的sql是需要kill的sql,没有别的类似相似的sql干扰:
SELECT pid,query FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
and datname='XXX'
and usename='YYY' and state='active'
and query like '%ZZZZZZZZ%'
order by (now()-query_start) desc;
如:
SELECT pid,query FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
and datname='flysafe_websdite'
and usename='app_rw' and state='active'
and query like '%SELECT * FROM "quiz_info" WHERE "quiz_info"."deleted_at" IS NULL AND (("questionnaire_id" IN ($1)) AND (enc_sn = $2))%'
order by (now()-query_start) desc;
--2.然后批量循环kill session
select pg_terminate_backend(pid) from (SELECT pid FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
and datname='XXX'
and usename='YYY' and state='active'
and query like '%ZZZ%'
) a \watch 5;
如:
select pg_terminate_backend(pid) from (SELECT pid FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
and datname='flysafe_websdite'
and usename='app_rw' and state='active'
and query like '%SELECT * FROM "quiz_info" WHERE "quiz_info"."deleted_at" IS NULL AND (("questionnaire_id" IN ($1)) AND (enc_sn = $2))%'
) a \watch 5;
3.2、操作系统中操作(要求登录到数据库主机)
有kill -9的语句可以用,但是不建议,会导致正在update的语句被kill之后,数据库进入recovery状态。
4、MySQL:
4.1、aws :
select concat('call mysql.rds_kill(',id,');') from information_schema.processlist
where user='ZZZ'
and info like '%ZZZ%' -- 当前消耗高的SQL语句
and command = '' -- 按照SQL语句的状态
order by time desc;
--- 在SQL命令行得到的kill命令不能直接粘贴复制,可通过shell命令快速得到kill id的脚本
mysql -uroot -p -h xxxx < kill_query.sh > kill_id.txt
4.2、阿里云 :
select concat('KILL ',id,';') from information_schema.processlist
where user='ZZZ' -- 操作的数据库用户
and info like '%ZZZ%' -- 当前消耗高的SQL语句
and command = '' -- 按照SQL语句的状态
order by time desc; -- 根据操作时间排序,先kill执行时间长的;
--- 在SQL命令行得到的kill命令不能直接粘贴复制,可通过shell命令快速得到kill id的脚本
mysql -uroot -p -h xxxx < kill_query.sh > kill_id.txt
4.3、内网
4.3.1、数据库内操作:
select time,concat('KILL ',id,';') from information_schema.processlist
where user='ZZZ' --操作的数据库用户
and info like '%ZZZ%' –当前消耗高的SQL语句
order by time desc; --根据操作时间排序,先kill执行时间长的;
4.3.2、操作系统中操作:(要求登录到数据库主机)
假定kill掉所有ZZZ用户的线程
mysqladmin -uroot -p processlist|awk -F "|" '{if($3 == "ZZZ")print $2}'|xargs -n 1 mysqladmin -uroot -p kill
最后修改时间:2021-03-25 14:49:12
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。