合 PG中有哪些结束会话的命令(pg_cancel_backend、pg_terminate_backend、pg_ctl kill等)
Tags: PGpg_cancel_backendpg_ctlpg_terminate_backend取消SQL结束会话
PG中有哪些结束会话的命令
pg_cancel_backend和pg_terminate_backend
pg_cancel_backend取消对后端进程具有指定进程ID的会话的当前查询。 如果调用角色是后端被取消的角色的成员,或者调用角色被授予pg_signal_backend
,也允许这样做,但是只有超级用户才能取消超级用户后端。
pg_terminate_backend终止后端进程具有指定进程ID的会话。 如果调用角色是后端被终止的角色的成员,或者调用角色被赋予pg_signal_backend
,那么也允许这样做,但是只有超级用户才能终止超级用户后端。
区别:pg_cancel_backend 只是取消当前某一个进程的查询操作,但不能释放数据库连接。但pg_terminate_backend可以在pg的后台杀死这个进程,从而释放出宝贵的连接资源,类似于kill -9 pid
操作。
两者都是boolean 类型的,返回为true 或者false 。
pg_signal_backend角色想要允许管理员启用受信任的、但是非超级用户的、发送信号给其他后端的角色。 当前,此角色允许发送信号以取消另一个后端上的查询或终止其会话。不过授予此角色的用户不能向属于超级用户的后端发送信号。
pg_cancel_backend
和pg_terminate_backend
向由进程 ID 标识的后端进程发送信号(分别是SIGINT或SIGTERM)。 一个活动后端的进程 ID可以从pg_stat_activity
视图的pid
列中找到,或者通过在服务器上列出postgres
进程(在 Unix 上使用ps或者在Windows上使用任务管理器)得到。 一个活动后端的角色可以在pg_stat_activity
视图的usename
列中找到。
1 2 3 4 5 | select a.* from pg_stat_activity a ; select pg_terminate_backend(a.pid) from pg_stat_activity a; where pid<>pg_backend_pid(); |
执行pg_cancel_backend后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | -- 会话2 postgres=# select pg_sleep(600); -- 此处在等待 -- 会话1 postgres=# select pg_cancel_backend(8119); pg_cancel_backend ------------------- t (1 row) -- 会话2 postgres=# select pg_sleep(600); ERROR: canceling statement due to user request postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 8119 (1 row) |
若是执行pg_terminate_backend后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | -- 会话2 postgres=# select pg_sleep(600); -- 此处在等待 -- 会话1 postgres=# select pg_terminate_backend(8119); pg_terminate_backend ---------------------- t (1 row) -- 会话2 postgres=# select pg_sleep(600); ERROR: canceling statement due to user request postgres=# postgres=# postgres=# select pg_backend_pid(); FATAL: terminating connection due to administrator command server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Succeeded. postgres=# |