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=# |
pg_ctl kill
1 2 3 4 5 6 | $ pg_ctl --help Usage: pg_ctl kill SIGNALNAME PID Allowed signal names for kill: ABRT HUP INT QUIT TERM USR1 USR2 |
如果pid为postgres的超级进程:
1 2 3 4 5 | pg_ctl kill TERM pid = pg_ctl stop -m smart pg_ctl kill INT pid = pg_ctl stop -m fast pg_ctl kill QUIT pid = pg_ctl stop -m immediate pg_ctl kill HUP pid = pg_ctl reload pg_ctl kill ABRT pid = 类似于关闭电源 |
若pid为普通用的进程号,则相当于取消SQL的查询:
1 2 | [pg13@lhrpg ~]$ pg_ctl kill INT 8119 [pg13@lhrpg ~]$ |
此时,客户端返回:
1 2 3 4 5 6 7 8 | postgres=# select pg_sleep(600); ERROR: canceling statement due to user request postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 8119 (1 row) |
ctrl+c
ctrl+c
也可以取消某个SQL语句,而不会结束当前会话。
1 2 3 4 5 6 7 8 | postgres=# select pg_sleep(600); Cancel request sent ERROR: canceling statement due to user request postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 8119 (1 row) |
kill -9
注意:kill -9 PID
会结束整个进程。如下:
1 2 3 4 5 6 7 8 | postgres=# select pg_sleep(600); 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: Failed. !?> !?> |