postgresql进程查看与管理

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);

猜你喜欢

转载自blog.csdn.net/riding_horse/article/details/130386357