Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

实时视图——pg_stat_activity

  • 查看所有客户端的连接状态

    SELECT * FROM pg_stat_activity;  
    
    • ClientRead: Waiting to read data from the client.
  • 统计查询

    • 查询目前所在事务的pid

      SELECT pg_backend_pid();
      
    • 目前所有客户端连接的数量

      SELECT count(*) 
      FROM pg_stat_activity 
      WHERE NOT pid=pg_backend_pid();
      
    • 系统允许的最大连接数

      SHOW max_connections;
      
    • 剩余连接数量

    SELECT max_conn-now_conn AS resi_conn 
    FROM (
        SELECT setting::int8 AS max_conn,
            (SELECT count(*) FROM pg_stat_activity) 
            AS now_conn 
        FROM pg_settings 
        WHERE name = 'max_connections'
    ) t
    
  • 实战

    • 【简单统计】所有客户端的连接状态

      SELECT pid, state, wait_event_type, wait_event,
      current_timestamp - least(query_start,xact_start) AS runtime,
      substr(query,1,50) AS current_query 
      FROM pg_stat_activity 
      WHERE pid<>pg_backend_pid() ;
      
    • 【详细查看】指定pid的状态

      SELECT * FROM pg_stat_activity where pid=xxxx; 
      
      • 部分列
        • backend_xid
          • 事务号
          • 有写操作才会申请
          • 可用来判断事务中是否有东西提交,这样方便我们确认可以手动关掉这个事务
        • backend_xmin
          • 事务快照
          • 在repeatable read以上的隔离级别才会有
          • 整个事务过程是一个不变的值
    • 【详细查看】指定用户的连接状态

      SELECT * FROM pg_stat_activity WHERE usename = 'xxx';
      
  • 查看是否追踪某个连接的SQL语句

    SHOW track_activities;
    
  • pg_stat_activity内的常用列

    • datname
    • usename
    • client_addr
    • client_port
    • current_query(新版本版本里叫query)
    • waiting(9.6版本后变成了 wait_event_type 和 wait_event)
  • 对于锁死阻塞的查询,可选如下两种方式修复(要超级权限)

    • 取消
      SELECT pg_cancel_backend(pid)
      
    • 终结
      SELECT pg_terminate_backend(pid);