专栏首页数据库架构之美如何杀掉pg数据库正在运行的sql

如何杀掉pg数据库正在运行的sql

我们在生产环境可能经常遇到长sql,长sql对数据库的影响还是挺大的,不仅可能对主机资源消耗较大,还可能会阻塞其他sql的正常执行,所以对于长sql我们要尤其注意。一般生产环境都会配置长sql告警,可以根据业务情况调整告警阈值。

那么在postgresql数据库如果遇到了长sql告警我们应该怎么处理呢?我总结一下:一查二看三杀。

一查:

首先我们要定位到是哪条sql引起的告警。登录pg数据库查看pg_stat_activity(pgxc架构使用pgxc_stat_activity)视图,通过query_start字段查看sql的开始运行时间,state字段表明了当前sql的状态,一般有三种:active表示sql活跃正在执行;idle表示当前该连接空闲,上一条sql已经执行完毕,当前没有sql在执行;idle in transaction表示当前事务还未结束,事务中上一条sql已经执行完毕,当前事务没有sql在执行,事务中空闲。pg_stat_activity视图中还有个pid字段,这个字段是当前连接的进程/线程号,这个我们后面处理的依据。

二看:

二看执行计划,我们使用explain 命令查看当前sql的执行计划,确认sql执行计划是否正确,是否走到了索引,是否走到了正确的索引,如果没有走正确索引,我们可以对表进行分析,重新收集统计信息。如果想得到更精确的信息,可以使用explain performance命令来查看更详细的执行计划信息,值得注意的是explain不会真正执行sql,而explain performance会真正执行sql。

三杀:

在定位sql后,我们往往会跟业务确认这条sql是否能够杀掉,当业务确认后,我们就需要杀掉该sql。

pg数据库杀掉某条sql有三种方法,也可以称为三板斧:cancel->terminate->kill

①使用pg_cancel_backend(pid)杀掉某条sql,这个是温柔的杀,向后台发送sigint信号,关闭当前后台进程,用户只能关闭自己的后台进程,事务回滚。

②使用pg_terminate_backend(pid)杀掉某条sql,这个是强杀,向后台发送sigterm信号,关闭当前后台进程,需要有超级用户权限,超级用户可以关闭所有后台进程,事务回滚。

③这里为什么会有第三种杀法呢?可能大家遇到过,使用pg_cancel_backend杀不掉的进程,但是其实pg_terminate_backend有时也无法杀掉某条sql,笔者在生产环境遇到过,这时我们可能会抓一下该连接的堆栈,然后我们可能想尽快杀掉该sql,问题原因后面再分析,这时我们就要从操作系统层面使用kill命令来杀掉连接了。通过上面查到的pid,在操作系统上ps -ef |grep pid查看当前连接的状态,然后kill -9 pid杀掉该连接。

postgres=# select pid,query_start,state,query from pg_stat_activity where state='active';
  pid  |          query_start          | state  |                                     query                                      
-------+-------------------------------+--------+--------------------------------------------------------------------------------
  5001 | 2019-08-13 12:45:16.652909+08 | active | select * from perf_analyse;
 18876 | 2019-08-13 12:45:19.019691+08 | active | select pid,query_start,state,query from pg_stat_activity where state='active';
(2 rows)

postgres=# \q
postgres@xxx:~> ps -ef |grep 5001
postgres  5001 23550 64 12:45 ?        00:00:13 postgres: postgres postgres [local] SELECT
postgres  7677  6228  0 12:45 pts/3    00:00:00 grep --color=auto 5001
postgres@xxx:~> kill -9 5001

上面三板斧在生产环境中还是建议从前到后执行,虽然第三种方法最直接有效,但是毕竟是生产环境,万一触发什么bug也不知道,所以迫不得已再使用。

好吧,加油吧。

本文分享自微信公众号 - 数据库架构之美(databasekernel),作者:数据库架构之美

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 记一次分布式数据库启动异常分析

    今天在测试环境遇到一个很有意思的问题,我们在测试一款分布式数据库,这款分布式数据库底层是基于postgresql做的,现象大致是这样的,我们在重启数据库集群后发...

    数据库架构之美
  • PostgreSQL中的八级锁

    锁是实现数据库并发控制必不可少的功能,PostgreSQL数据库通过其特有的多版本属性实现了MVCC,实现了读不阻塞写,写不阻塞读。PostgreSQL中表锁有...

    数据库架构之美
  • 基于repmgr的postgresql主备高可用方案

    本文比较基础,主要介绍postgresql开源高可用工具repmgr的部署和使用,初学者可以根据本文步骤一步一步做下去,废话不多说,直接进入主题,本文以两台机器...

    数据库架构之美
  • MySQL审计

    线上的数据库,开发可以直接navicat软件直接操作。一旦发生数据泄露,后果严重。需要禁止使用navicat,使用命令行操作,并且能记录每个开发执行的SQL语句...

    py3study
  • Elasticsearch-sql 用SQL查询Elasticsearch

    Elasticsearch的查询语言(DSL)真是不好写,偏偏查询的功能千奇百怪,filter/query/match/agg/geo各种各样,不管你是通过封装...

    用户1225216
  • Groovy-16.数据库

    UPDATE和DELETE操作都是写好SQL然后通过execute执行,但是需要commit()提交(在后文“提交”中介绍)。

    悠扬前奏
  • pl sql 查看历史执行过的sql记录

    现在越来越多人用plsql 查询和执行sql,因为该工具很方便,不仅可以执行sql、以及命令窗口,但是呢,有时候我们执行完sql,可能忘记保存或者当时觉得可能不...

    小小鱼儿小小林
  • Oracle AWR 阙值影响历史执行计划

          最近有网友提到为什么在dba_hist_sql_plan中无法查看到sql语句的历史执行计划,对于这个问题是由于缺省情况下,Oracle 设定的阙值...

    Leshami
  • SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

    用户1112962
  • 小生归一(七)sprintf字符串格式化漏洞

    通过fuzz得知,在php的格式化字符串中,%后的一个字符(除了'%')会被当作字符类型,而被吃掉,单引号',斜杠\也不例外。

    7089bAt@PowerLi

扫码关注云+社区

领取腾讯云代金券