GreenPlum死锁问题定位手记

本文记录了在GreenPlum 5.0版本中遇到的死锁问题,主要是在gpcrondump备份期间,同时执行自定义存储过程导致。通过查询pg_stat_activity和pg_locks等表,分析出死锁是由于两个连接在Master节点上相互等待对方持有的锁。解决方案可能是避免DDL和DML操作的同时进行,或者利用额外的表实现操作互斥。
摘要由CSDN通过智能技术生成

问题描述

  • GreenPlum 5.0版本,在使用 gpcrondump 做备份时,如果同时还在执行一个自己写的存储过程,就有很高概率导致数据库死锁
  • 该存储过程中涉及到表的创建、删除、数据导入等动作

分析过程

  • 因对GPDB以及Postgresql都不太熟,先在网上搜索了下“GreenPlum 死锁”,果真找到一篇定位过程分享 ,作者写的非常详细,几乎是手把手、图文并茂的讲述了他排查GPDB死锁的过程。参考该文章,定位步骤如下:
    1. 待问题重现时,从 pg_stat_activity 表中查找处于等锁状态的任务:
      select * from pg_stat_activity where waiting_reason='lock';
template1=# select * from pg_stat_activity where waiting_reason='lock';
 datid | datname | procpid | sess_id | usesysid | usename |                           current_query                           | waiting |          query_start          |         backend_start         | client_addr | client_port | application_name |          xact_start  
         | waiting_reason | rsgid | rsgname | rsgqueueduration 
-------+---------+---------+---------+----------+---------+-------------------------------------------------------------------+---------+-------------------------------+-------------------------------+-------------+-------------+------------------+----------------------
---------+----------------+-------+---------+------------------
 97128 | dsst    |     923 |     244 |       10 | gpadmin | truncate c_picrecord_1_prt_extra ;                                | t       | 2017-12-11 15:10:18.840394+08 | 2017-12-08 16:57:48.826455+08 |             |          -1 | psql             | 2017-12-11 15:10:18.8
40394+08 | lock           |     0 |         | 
 97128 | dsst    |   20528 |     393 |       10 | gpadmin | SELECT pg_get_partition_def('97147'::pg_catalog.oid, true, true)  | t       | 2017-12-11 15:10:25.10717+08  | 2017-12-11 15:10:24.877717+08 |             |          -1 |                  | 2017-12-11 15:10:24.8
90674+08 | lock           |     0 |         | 
(2 rows)
  1. 可见truncate c_picrecord_1_prt_extraSELECT pg_get_partition_def('97147'::pg_catalog.oid, true, true)两个任务死锁了。
    前者就是我们自己写的存储过程中的一个步骤;后者是数据库备份过程中自动产生的任务。
  2. 关联pg_locks,pg_class,pg_stat_activity 表,查询与上述任务相关的锁。这里我们按照存储过程中使用的表名称过滤&
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值