转载: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似乎要友好些

--结论

    1. postgresql 8.3.3的版本 只提供系统函数
      pg_cancel_backend(pid int) 杀进程,但是,这个函数只能 kill  Select  查询,而updae,delete DML不生效,感兴趣的朋友可以自己做实验验证下;
    2. postgresql 8.4 以后版本提供 函数
      pg_terminate_backend(pid int), 这个函数功能比前者强大,可以kill 各种DML(SELECT,UPDATE,DELETE,DROP)操作;
    3. 对于Postgresql ,最好不要用kill -9
      去杀用户进程,因为如果是一个很大的UPDATE,kill后,Postgresql需要很长的时间做Recovery,而在这个RECOVERY过程中,数据库是不可用的,在这点上,Oracle
      要友好些,在数据库恢复的过程中数据库依然可用,不太需要因Kill -9
      用户进程而造成数据库不可用的情况。

PostgreSQL 不要使用kill -9 杀 Postgresq 用户进程的更多相关文章

  1. Linux CPU 100%, kill -9 杀不掉进程

    1: top 查看 >top -c 此时 我们使用kill -9 15003, 杀掉这个进程短暂的CPU降低几秒, 然后死灰复燃了, 又一个进程占了CPU 99% 2: 查看15003 进程状态 ...

  2. PostgreSql中如何kill掉正在执行的sql语句

    虽然可以使用 kill -9 来强制删除用户进程,但是不建议这么去做. 因为:对于执行update的语句来说,kill掉进程,可能会导致Postgres进入到recovery mode 而在recov ...

  3. ucore操作系统学习(五) ucore lab5用户进程管理

    1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步 ...

  4. sqlserver检测死锁;杀死锁和进程;查看锁信息

    http://blog.sina.com.cn/s/blog_9dcdd2020101nf4v.html sqlserver检测死锁;杀死锁和进程;查看锁信息 ( ::)转载▼ 标签: sql 检测死 ...

  5. paip.杀不死进程的原因--僵尸进程的解决.txt

    paip.杀不死进程的原因--僵尸进程的解决.txt 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...

  6. Linux内存点滴:用户进程内存空间

    原文出处:PerfGeeks 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Residen ...

  7. Linux内存点滴 用户进程内存空间

    Linux内存点滴 用户进程内存空间 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的. VIRT, Virtual Image (kb) RES, Re ...

  8. Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程

    Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程 原因: 一般造成这种原因是因为项目中有非守护线程的存在: 解决方案: 一.从Tomcat上解决 方案1:(推荐的方案:因为一台 ...

  9. linux上限制用户进程数、cpu占用率、内存使用率

    限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > ...

随机推荐

  1. python 之 数据库(多表查询之连接查询、子查询、pymysql模块的使用)

    10.10 多表连接查询 10.101 内连接 把两张表有对应关系的记录连接成一张虚拟表 select * from emp,dep: #连接两张表的笛卡尔积 select * from emp,de ...

  2. Android 7.0 之后相机/文件读写等权限获取方式改变,导致开启相机闪退

    在 Android 7.0 之前 Google 提供的动态申请权限的 API,可以调用相机拍照,访问SDcard等操作都只需要申请对应的权限,如下: <uses-permission andro ...

  3. 如何自定义xml文件

    在定义文件之前,首先要弄清楚什么是xml文件和dtd文件. 一:什么是xml文件? xml是一种可扩展标记性语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有构造性的标记语言. 二:什么事d ...

  4. Asp.net Report动态生成

    rdlc报表实质上是一个xml文件,如果要实现动态报表,就需要动态生成rdlc文件,实质上就是读写xml文件: protected XmlDocument GenerationAddReportCol ...

  5. 【转载】C#指定文件夹下面的所有内容复制到目标文件夹下面

    在涉及到文件夹操作的过程中,有时候需要将文件夹下的所有内容复制拷贝到另一个文件夹,在C#的开发中有时候会遇到这个功能需求将指定文件夹下所有的内容复制到另一个文件夹,这个过程需要遍历所有的文件和目录.此 ...

  6. Python 简单web服务器的实现

    import re import socket def service_cilent(new_socket): request = new_socket.recv(1024).decode(" ...

  7. 如何避免Linux操作系统客户端登陆超时-linux命令之TMOUT=

    工作中经常遇到使用ssh,telnet工具登陆Linux操作系统时,出现的超时问题,怎么处理呢? 添加下面命令: TMOUNT=

  8. 7层网络以及5种Linux IO模型以及相应IO基础

    一.七层网络模型 OSI是Open System Interconnection的缩写,意为开放式系统互联.国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,它是一个七层的. ...

  9. 修改mysql/MariaDB数据库的端口号+远程

    1.修改端口 2.远程+开放端口 (1)设置远程账号:xxx和密码yyyyyyygrant all privileges on *.* to 'xxx'@'%' identified by 'yyyy ...

  10. Haddop完全分布式集群搭建

    hadoop完全分布式搭建 建议(遇到的坑): 如果自己用的操作系统就是linux,我本身是deepin系统,装了两台虚拟机,结果,用户名没有配置,导致启动不了,因为hadoop的master节点启动 ...