1、查看数据库当前的进程 汇总
SELECT
mmm.procpid 进程_pid,
mmm.START 开始时间,
mmm.lap 消耗时长,
fff.datname 数据库名,
fff.usename 用户名,
fff.wait_event_type,
fff.wait_event,
fff.state,
mmm.current_query
FROM
(
SELECT
procpid,
START,
now( ) - START AS lap,
current_query
FROM
(
SELECT
backendid,
pg_stat_get_backend_pid ( S.backendid ) AS procpid,
pg_stat_get_backend_activity_start ( S.backendid ) AS START,
pg_stat_get_backend_activity ( S.backendid ) AS current_query
FROM
( SELECT pg_stat_get_backend_idset ( ) AS backendid ) AS S
) AS S
WHERE
current_query <> '<IDLE>'
) mmm
INNER JOIN ( SELECT datname, pid, leader_pid, usename, application_name, client_addr, query_start, wait_event_type, wait_event, STATE, query FROM pg_stat_activity ) fff ON mmm.procpid = fff.pid
ORDER BY
mmm.lap DESC;
- wait_event_type: 这字段表示等待事件的类型
- LWLock:后端正在等待轻量级锁。每个这样的锁都保护共享内存中的特定数据结构。 wait_event将包含一个标识轻量级锁用途的名称。(一些锁有特定的名称;其他锁属于一组锁,每个锁都有类似的用途。)
- Lock:后端正在等待重量级锁。重量级锁,也称为锁管理器锁或简称锁,主要保护 SQL 可见的对象,例如表。但是,它们也用于确保某些内部操作(例如关系扩展)的互斥。 wait_event将识别等待的锁类型。
- BufferPin:在没有其他进程可以检查该缓冲区的期间,服务器进程正在等待访问数据缓冲区。如果另一个进程持有一个打开的游标,该游标最后从相关缓冲区读取数据,则缓冲区 pin 等待可能会延长。
- Activity: 服务器进程空闲。这由等待其主处理循环中的活动的系统进程使用。wait_event将确定具体的等待点。
- Extension:服务器进程正在等待扩展模块中的活动。此类别对于跟踪自定义等待点的模块很有用。
- Client:服务器进程正在等待来自用户应用程序的套接字上的某些活动,并且服务器期望发生一些独立于其内部进程的事情。wait_event将确定具体的等待点。
- IPC:服务器进程正在等待服务器中另一个进程的某些活动。wait_event将确定具体的等待点。
- Timeout:服务器进程正在等待超时到期。wait_event将确定具体的等待点。
- IO:服务器进程正在等待 IO 完成。wait_event将确定具体的等待点。
- wait_event:
- state:状态
- active:后端正在执行查询。
- idle:后端正在等待新的客户端命令。
- idle in transaction:后端处于事务中,但当前未执行查询。
- idle in transaction (aborted):此状态类似于idle in transaction,只是事务中的一条语句导致 了错误。
- fastpath function call:后端正在执行快速路径功能。
- disabled:如果在此后端禁用track_activities ,则会报告此状态。
2、查看数据库当前的进程,看一下有无正在执行的慢SQL记录线程。
SELECT
procpid,
start,
now() - start AS lap,
current_query
FROM
(SELECT
backendid,
pg_stat_get_backend_pid(S.backendid) AS procpid,
pg_stat_get_backend_activity_start(S.backendid) AS start,
pg_stat_get_backend_activity(S.backendid) AS current_query
FROM
(SELECT pg_stat_get_backend_idset() AS backendid) AS S
) AS S
WHERE
current_query <> '<IDLE>'
ORDER BY
lap DESC;
- procpid:进程id 如果不确认进程ID,将上面的条件去掉,可以逐条分析
- start:进程开始时间
- lap:消耗时间
- current_query:执行中的sql
3、查找表锁定的进程
SELECT A
.locktype,
A.DATABASE,
A.pid,
A.MODE,
A.relation,
b.relname
FROM
pg_locks
A JOIN pg_class b ON A.relation = b.OID
WHERE
UPPER ( b.relname ) = 'TABLE_NAME';
4、查看具体表的sql执行情况 查看数据库进程
--查询具体表的执行情况
SELECT * FROM pg_stat_activity where query ~ '表名';
-- 包含本窗口的所有数据库连接数
SELECT count(*) FROM pg_stat_activity;
-- 包含本窗口的所有数据库连接情况
SELECT * FROM pg_stat_activity;
5、杀事务(kill有两种方式)
-- 这种方式只能kill select查询,对update、delete 及DML不生效)
SELECT pg_cancel_backend( PID);
-- 这种可以kill掉各种操作(select、update、delete、drop等)操作
SELECT pg_terminate_backend(PID);
本文含有隐藏内容,请 开通VIP 后查看