查看是否该表正在执行的状态

SELECT
    a.pid,
    a.state,
    a.application_name,
    a.client_addr,
    l.mode,
    l.granted,
    a.query
FROM pg_locks l
JOIN pg_stat_activity a ON l.pid = a.pid
WHERE l.relation = '你的表'::regclass;

查询出来的数据如果query 列显示select 正常,如果在表没有任何数据操作的过程中,长事件出现insert 或者update 很有可能锁表了

这个时候看下是不是有Create Index 创建索引的语句,或者有 Drop Table Index 删除索引的操作,

pid:进程 ID

state:进程状态(均为 active)

application_name:应用程序标识(大多为 hgproxy: app[…],少数来自 Navicat)

client_addr:客户端地址(几乎都是 10.132.108.96)

mode:锁模式(主要是 AccessShareLock,少数为 RowExclusiveLock,还有一个 AccessExclusiveLock)

granted:是否已授予锁(t 为是,f 为否)

query:正在执行的 SQL 语句

  1. 锁阻塞严重
    AccessExclusiveLock 是 PostgreSQL 中最强的锁级别

它会阻塞所有对 你的xxxx 表的:

所有 SELECT 查询(即使是只读)

所有 INSERT/UPDATE/DELETE 操作

所有其他 DDL 操作(包括创建索引、修改表结构等)

– 强制终止该进程

SELECT pg_terminate_backend(2406671);

– 或更温和的方式(允许事务回滚)

SELECT pg_cancel_backend(2406671);
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐