查看表的状态
查看sys_stat_active视图的wait_event_type字段的值,查询SQL
SELECT * FROM SYS_STAT_ACTIVITY WHERE QUERY LIKE '%执行的SQL%' ;
SELECT * FROM SYS_STAT_ACTIVITY WHERE DATNAME = '数据库名' AND USERNAME = '用户名';
SELECT * FROM SYS_STAT_ACTIVITY WHERE WAIT_EVENT_TYPE = 'Lock';
pg_stat_activity 是 PostgreSQL 内置的一个系统视图, 是 PostgreSQL 实例维护的一个进程相关的视图,是实时变化的。
官方对他的定义是:每一行都表示一个系统进程,显示与当前会话的活动进程的一些信息,比如当前回话的状态和查询等。
主要字段
Column  | Type  | Description  | 
|---|
datid  | oid  | 后台连接的数据库id(OID)  | 
|---|
datname  | name  | 后台连接的数据库名  | 
|---|
pid  | integer  | 后代进程id(PID)  | 
|---|
usesysid  | oid  | 连接到后台的用户id  | 
|---|
usename  | name  | 连接到后台的用户名称  | 
|---|
application_name  | text  | 通过后台连接的应用程序名称  | 
|---|
client_addr  | inet  | 后台连接的IP地址。当该字段为空时,说明客户端是在服务器主机上通过Unix的socket协议直连,或是数据库内部进程(如autovacuum等)  | 
|---|
client_hostname  | text  | 根据client_addr字段,通过DNS解析获取的对应主机名称.   但仅当log_hostname被开启时才有效,并且只有通过IP协议连接时才能记录到主机名;  | 
|---|
client_port  | integer  | 后台连接使用的TCP端口号。当使用Unix-Socket协议连接时此值为-1。  | 
|---|
backend_start  | timestamp with time zone  | 进程开始的时间,即客户端连接到服务器的时刻。  | 
|---|
xact_start  | timestamp with time zone  | 进程的当前事务开始执行的时间。若当前无活动事务,该值为null。 如果当前query是事务中的首次查询,此项值应与query_start列相同.  | 
|---|
query_start  | timestamp with time zone  | 当前事务中有在执行中的语句时,此值记录该语句开始执行的时间;若事务state不是active状态,此值记录的是上一次开始执行语句时间。(即每次开始执行新的语句时此值更新)  | 
|---|
state_change  | timestamp with time zone  | 记录进程中事务状态发生改变的时刻;  | 
|---|
wait_event_type  | text  | LWLockNamed:表示backend后台进程等待某种特定的轻量级锁; LWLockTranche:表示backend后台进程等待一组相关轻量级锁; Lock:表示backend后台进程等待重量级的锁,通常是指 relation、tuple、page、transactionid   等子类型锁; BufferPin:表示server process 后台进程等待 buffer pin,手册上解释为 Waiting to acquire a   pin on a buffer 
  | 
|---|
wait_event  | text  | 如果后端当前正在等待,则等待事件名称,否则为 NULL。  | 
|---|
state  | text  | 表示后台进程的整体状态。可能的值有:     active(活动):进程正在执行某个语句 idle(空闲): 进程正在等待客户端的指令  idle in transaction (事务空闲): 进程在处理事务过程中,但当前未执行任何语句 idle in transaction (aborted)(事务空闲-退出):当事务中某个语句执行出错的情况外,其余情况与idle in   transaction相同. fastpath function call(快通道函数调用): 后台正在执行某个快通道函数 disabled(禁用): This state is reported if track_activities is   disabled in this backend. 
  | 
|---|
backend_xid  | xid  | 此后端的顶级事务标识符(如果有)  | 
|---|
backend_xmin  | xid  | 当前后端的xmin范围  | 
|---|
query  | text  | 后台进程最近(当前)执行的语句内容.   当状态是 active时,它记录的是正在执行的语句内容;否则记录的是上一条语句执行的内容  | 
|---|
backend_type  | text  | 当前后端的类型。可能的类型有autovacuum   launcher, autovacuum worker, logical replication launcher, logical   replication worker, parallel worker, background writer, client backend,   checkpointer, archiver, startup, walreceiver,walsender和walwriter.   此外,通过扩展注册的后台进程可能还有其他类型。     | 
|---|
当wait_event_type的状态为Lock时,该表发生锁表。记录下来该表对应的PID。
wait_event_type的其他状态:
LWLock:后端正在等待一个轻量级锁。每一个这样的锁保护着共享内存中的一个特殊数据结构。
Lock:后端正在等待一个重量级锁。重量级锁也称为锁管理器锁或者简单锁,主要保护SQL可见的对象
BufferPin:服务器进程正在等待访问一个数据缓冲区,而此时没有其他进程正在检查该缓冲区。
Activity:服务器进程处于闲置状态。这被用于在其主处理循环中等待活动的系统进程。wait_event将标识特定的等待点。
Extension:服务器进程正在一个扩展模块中等待活动。
Client:服务器进程正在一个套接字上等待来自用户应用的某种活动,并且该 服务器预期某种与其内部处理无关的事情 发生。wait_event将标识特定的等待点。
IPC:服务器进程正在等待来自服务器中另一个进程的某种活动。wait_event将标识特定的等待点。
Timeout:服务器进程正在等待一次超时发生。wait_event将标识特定的等待点。
IO:服务器进程正在等待一次IO完成。
除了查询sys_stat_active视图还可以查询sys_locks视图
SELECT OID FROM SYS_CLASS WHERE RELNAME = '表名';
SELECT PID FROM SYS_LOCKS WHERE RELATION = 'OID';
解锁
释放对应的事务
SELECT sys_terminate_backend(pid);
执行后显示sys_terminate_backend为true时表示该问题已解决。
 
                        
                        
                            
评论