PostgreSQL 不要使用kill -9 杀 Postgresq 用户进程
转载:http://francs3.blog.163.com/blog/static/4057672720109854858308/
Postgresql 8.3.3
今天应用反映数据库很慢,有些SQL执行一天都没执行完,
检查数据库,发现大量会话在更新同一张表 tbl_tmp, 产生大量行锁申请等侍。
--等于等侍状态的SQL (被堵住的SQL)
anpstat=# select datname,procpid,query_start,current_query,waiting,client_addr from pg_stat_activity where waiting='t';
datname | procpid | query_start | current_query | waiting | client_addr
----------+---------+-------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+---------+-------------
sanpstat | 14044 | 2010-10-07 16:46:40.386904+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 27839 | 2010-10-07 16:49:18.022499+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 3539 | 2010-10-07 20:28:13.212075+08 | update tbl_tmp set feedback =$1 where seq=$2 | t | 127.0.0.1
sanpstat | 3894 | 2010-10-07 20:53:43.466517+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 10130 | 2010-10-08 09:37:51.253871+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 9083 | 2010-10-08 08:08:59.221976+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 10038 | 2010-10-08 09:25:55.434459+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 10241 | 2010-10-08 09:51:13.990492+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1 | t | 127.0.0.1
sanpstat | 11147 | 2010-10-08 11:11:21.574665+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 11168 | 2010-10-08 11:17:17.158246+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 11926 | 2010-10-08 11:54:10.704641+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
sanpstat | 11959 | 2010-10-08 11:56:07.021072+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | t | 127.0.0.1
--正在执行的 update 语句(堵住了其它SQL)
sanpstat=# select datname,procpid,query_start,current_query,waiting,client_addr from pg_stat_activity where waiting='f'
sanpstat-# and current_query like '%update tbl_tmp %';
datname | procpid | query_start | current_query | waiting | client_addr
----------+---------+-------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+---------+---------------
sanpstat | 2012 | 2010-10-07 16:52:55.8228+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 14157 | 2010-10-07 16:41:37.308062+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 10177 | 2010-10-08 09:43:43.297872+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 2043 | 2010-10-07 19:25:46.931806+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 3298 | 2010-10-07 19:37:53.307125+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 3322 | 2010-10-07 19:40:39.373079+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 4114 | 2010-10-08 09:25:18.701269+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 9082 | 2010-10-08 09:18:16.153882+08 | update tbl_tmp set show=1 , gmt_modified=now(), modifier=$1 where seq=$2 | f | 127.0.0.1
sanpstat | 10042 | 2010-10-08 09:32:55.260732+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 10278 | 2010-10-08 11:08:55.334562+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 11810 | 2010-10-08 11:46:24.147652+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 | f | 127.0.0.1
sanpstat | 11964 | 2010-10-08 11:58:32.831916+08 | update tbl_tmp set responsed=true , feedback =$1, gmt_modified=now(), modifier=$2 where seq=$3 |
--用pg_cancel_backend()杀进程
sanpstat=# select pg_cancel_backend(2012);
pg_cancel_backend
-------------------
t
(1 row)
用 pg_cancel_backend()杀进程,虽然显示为 't' ,但进程还在,文档上解释 Cancel a backend's current query,猜想pg_cancel_backend()只能 kill select 语句,而不能kill update语句,后来实验也证实了这一点,有兴趣的朋友可以自己做实验去验证下。
--kill
-9 杀进程
kill -9 2012
kill -9 14157
kill -9 10177
kill -9 2043
kill -9 3298
kill -9 3322
kill -9 4114
kill -9 9082
kill -9 10042
kill -9 10278
kill -9 11810
kill -9 11964
这里将正在执行的update tbl_tmp 表的会话kill 掉.
--数据库无法连接
[enterprisedb@sanp-rich-db1 ~]$ psql -h 192.168.3.27 -p 1921 -d postgres -U rmt_db_bak
psql: FATAL: the database system is in recovery mode
备注:进程kill -9 以后,发现数据库无法连接,遭了,还好是个测试库。
--数据库处于恢复模式
-bash-3.2$ ps -ef | grep post
postgres 4627 1 0 Apr12 ? 00:02:24 /home/postgres/bin/postgres -D /mnt/data
postgres 4629 4627 0 Apr12 ? 00:00:04 postgres: logger process
root 14195 14168 0 15:37 pts/7 00:00:00 su - postgres
postgres 14196 14195 0 15:37 pts/7 00:00:00 -bash
postgres 14332 4627 44 15:41 ? 00:00:18 postgres: startup process recovering 00000001000000DA0000006E
postgres 21495 14196 0 15:41 pts/7 00:00:00 ps -ef
postgres 21496 14196 0 15:41 pts/7 00:00:00 grep post
发现Postgresql 处于 recovery 状态,奇怪,Postgresql 恢复过程中是不允许连接的,在这点上,Oracle似乎要友好些
--结论
- postgresql 8.3.3的版本 只提供系统函数
pg_cancel_backend(pid int) 杀进程,但是,这个函数只能 kill Select 查询,而updae,delete DML不生效,感兴趣的朋友可以自己做实验验证下; - postgresql 8.4 以后版本提供 函数
pg_terminate_backend(pid int), 这个函数功能比前者强大,可以kill 各种DML(SELECT,UPDATE,DELETE,DROP)操作; - 对于Postgresql ,最好不要用kill -9
去杀用户进程,因为如果是一个很大的UPDATE,kill后,Postgresql需要很长的时间做Recovery,而在这个RECOVERY过程中,数据库是不可用的,在这点上,Oracle
要友好些,在数据库恢复的过程中数据库依然可用,不太需要因Kill -9
用户进程而造成数据库不可用的情况。
PostgreSQL 不要使用kill -9 杀 Postgresq 用户进程的更多相关文章
- Linux CPU 100%, kill -9 杀不掉进程
1: top 查看 >top -c 此时 我们使用kill -9 15003, 杀掉这个进程短暂的CPU降低几秒, 然后死灰复燃了, 又一个进程占了CPU 99% 2: 查看15003 进程状态 ...
- PostgreSql中如何kill掉正在执行的sql语句
虽然可以使用 kill -9 来强制删除用户进程,但是不建议这么去做. 因为:对于执行update的语句来说,kill掉进程,可能会导致Postgres进入到recovery mode 而在recov ...
- ucore操作系统学习(五) ucore lab5用户进程管理
1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步 ...
- sqlserver检测死锁;杀死锁和进程;查看锁信息
http://blog.sina.com.cn/s/blog_9dcdd2020101nf4v.html sqlserver检测死锁;杀死锁和进程;查看锁信息 ( ::)转载▼ 标签: sql 检测死 ...
- paip.杀不死进程的原因--僵尸进程的解决.txt
paip.杀不死进程的原因--僵尸进程的解决.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- Linux内存点滴:用户进程内存空间
原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Residen ...
- Linux内存点滴 用户进程内存空间
Linux内存点滴 用户进程内存空间 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的. VIRT, Virtual Image (kb) RES, Re ...
- Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程
Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程 原因: 一般造成这种原因是因为项目中有非守护线程的存在: 解决方案: 一.从Tomcat上解决 方案1:(推荐的方案:因为一台 ...
- linux上限制用户进程数、cpu占用率、内存使用率
限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > ...
随机推荐
- Kubernetes(k8s) docker 修改 /dev/shm大小
一.问题 /dev/shm在/etc/fstab中挂载,对应tmpfs,实际使用的是内存的空间.默认情况下,/dev/shm为物理内存大小的一半. 在Kubernetes上跑docker,发现/dev ...
- 1byte、1KB、4KB,1MB、1GB用16进制表示的范围。任意地址范围求字节数
1byte.1KB.4KB,1MB.1GB用16进制表示的范围.任意地址范围求字节数 2018-02-12 18:27:48 望那伊人 阅读数 5032更多 分类专栏: 计算机相关 版权声明:本文 ...
- Sonya and Matrix Beauty CodeForces - 1080E (manacher)
大意: 给定$nm$字符串矩阵. 若一个子矩形每一行重排后可以满足每行每列都是回文, 那么它为好矩形. 求所有好矩形个数. 一个矩形合法等价于每一行出现次数为奇数的最多只有一个字符, 并且对称的两行对 ...
- 在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)
原文:在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 1.如果去掉这个临时表中合计为0 ...
- ajax实现文件上传,多文件上传,追加参数
1.html部分实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- jenkins pipline
def getHost(){ def remote = [:] remote.name = 'server02' remote.host = '39.19.90' remote.user = 'roo ...
- iOS 中各种横竖屏切换总结
iOS 中横竖屏切换的功能,在开发iOS app中总能遇到.以前看过几次,感觉简单,但是没有敲过代码实现,最近又碰到了,demo尝试了几种情况,这里就做下总结.注意 横屏两种情况是反的你知道吗? UI ...
- ElementUI对话框(dialog)提取为子组件
需求:在页面的代码太多,想把弹窗代码提取为子组件,复用也方便. 这里涉及到弹窗el-dialog的一个属性show-close: show-close="false"是设置不显 ...
- vue实现一个评论列表
<!DOCTYPE html> <html> <head> <title>简易评论列表</title> <meta charset=& ...
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...