pg_cancel_backend()和pg_terminate_backend()

pg_cancel_backend()和pg_terminate_backend() 

两个函数的官方解释: 
pg_cancel_backend() 取消后台操作,回滚未提交事物 
pg_terminate_backend() 中断session,回滚未提交事物 

pg_cancel_backend()举例: 
session A: 
postgres=# create table t1 (a int); 
CREATE TABLE 
postgres=# begin; 
postgres=# insert into t1 select generate_series(1,100000000); 

session B: 
tina=# select datname,pid, query from pg_stat_activity; 
datname  | pid  |                        query                        
----------+------+----------------------------------------------------- 
postgres | 1923 | insert into t2 select generate_series(1,100000000); 
tina     | 1922 | select datname,pid, query from pg_stat_activity; 
(2 rows) 

tina=# select pg_cancel_backend(1923); 
pg_cancel_backend 
------------------- 

(1 row) 

session A: 
STATEMENT:  insert into t2 select generate_series(1,100000000); 
ERROR:  canceling statement due to user request 
postgres=# commit; 
ROLLBACK 
postgres=# select * from t2; 

--- 
(0 rows) 

session B: 
tina=#  select datname,pid, query from pg_stat_activity; 
datname  | pid  |                      query                       
----------+------+-------------------------------------------------- 
postgres | 1923 | commit; 
tina     | 1922 | select datname,pid, query from pg_stat_activity; 

pg_terminate_backend() 举例: 
session A: 
postgres=# create table t2 (a int); 
CREATE TABLE 
postgres=# begin; 
BEGIN 
postgres=# insert into t2 select generate_series(1,100000000); 

session B: 
tina=# select datname,pid, query from pg_stat_activity; 
datname  | pid  |  query                        
---------+------+------------- 
postgres | 1874 | insert into t2 select generate_series(1,100000000); 
tina     | 1914 | select * from pg_stat_activity; 
(2 rows) 

postgres=# select pg_terminate_backend(1874); 
pg_terminate_backend 
---------------------- 
t (1 row) 

session A: 
FATAL:  terminating connection due to administrator command 
STATEMENT:  insert into t2 select generate_series(1,100000000); 
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=# commit; 
WARNING:  there is no transaction in progress 
WARNING:  there is no transaction in progress 
COMMIT 
postgres=# select * from t2; 

--- 
(0 rows) 

session B: 
tina=# select datname,pid, query from pg_stat_activity; 
datname  | pid  |  query                        
---------+------+------------- 
tina     | 1914 | select * from pg_stat_activity; 
(1 rows) 

在pg_cancel_backend()下,session还在,事物回退; 
在pg_terminate_backend()操作后,session消失,事物回退。 

如果在某些时候pg_terminate_backend()不能杀死session,那么可以在os层面,直接kill -9 pid

时间: 2025-01-30 16:29:16

pg_cancel_backend()和pg_terminate_backend()的相关文章

PgSQL · 最佳实践 · CPU满问题处理

前言 在数据库运维当中,一个DBA比较常遇到又比较紧急的问题,就是突发的CPU满(CPU利用率达到100%),导致业务停滞.DBA不一定非常熟悉业务实现逻辑,也不能掌控来自应用的变更或负载变化情况. 所以,遇到CPU满,往往只能从后端数据库开始排查,追溯到具体SQL,最终定位到业务层.这里我们总结下这个问题具体的处理方法. 查看连接数变化 CPU利用率到达100%,首先怀疑,是不是业务高峰活跃连接陡增,而数据库预留的资源不足造成的结果.我们需要查看下,问题发生时,活跃的连接数是否比平时多很多.对

Postgresql数据库运维笔记

1. 对象创建 研发.测试无权创建.删除数据库和表,也无权修改表结构,都由DBA统一操作 a)创建数据库: CREATE DATABASE dbsample           --数据库名不能与现有库重复,pg严格区分大小写,因此请统一小写命名,不能使用特殊字符(@ # &等),不能以数字开头,可以以字母和下划线开头,不能超过63个字符 WITH OWNER = postgres                    --指定数据库的属主为postgres       ENCODING = '

PostgreSQL中关闭死锁进程的方法_PostgreSQL

由于使用的PostgreSQL数据库,没有资料.只好进行谷歌. 最终在一个英文论坛中发现了解决方法. 如下: 1.检索出死锁进程的ID 复制代码 代码如下: SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID '; 检索出来的字段中,[wating ]字段,数据为t的那条,就是死锁的进程.找到对应的[procpid ]列的值. 2.将进程杀掉 复制代码 代码如下: SELECT pg_cancel_backend('死锁那条数据的proc

通过函数定位DML锁等待

--创建函数,注意此函数只能定位由于dml操作所引起的锁等待,对于ddl引起的锁等待,此sql无法完全定位 CREATE OR REPLACE FUNCTION report_lock(refcursor, refcursor) RETURNS SETOF refcursor AS $BODY$ declare v_activity_count integer; v_cur_relation_info record; v_cur_tuple_info record; begin select c

分布式DB锁问题排查方法 - 阿里云HybridDB for PostgreSQL最佳实践

标签 PostgreSQL , Greenplum , 锁 , SEGMENT不一致 , gp_session_role=utility , gp_dist_random 背景 Greenplum(GPDB)是一个分布式数据库,分布式数据库的锁管理比单机更加复杂.例如在加锁时,需要对所有节点加锁(包括MASTER和所有的SEGMENT节点),在释放锁时,则需要释放所有节点的锁. 如果在释放过程中,MASTER的锁释放了,而SEGMENT锁没有释放,会造成什么问题呢? 不用说,会有很诡异的问题出现

PostgreSQL 锁等待监控 珍藏级SQL - 谁堵塞了谁

标签 PostgreSQL , pg_locks , pg_stat_activity , 锁监控 , 谁堵塞了谁 背景 在数据库中,通过锁以及多版本并发控制可以保护数据的一致性,例如A正在查询数据,B就无法对A访问的对象执行DDL.A正在更新某条记录,B就不能删除或更新这条记录. 锁是数据库自动管理的,同时数据库还提供了AD LOCK或者LOCK语法,允许用户自己控制锁. 例如AD lock的应用可以参考如下: <PostgreSQL 使用advisory lock实现行级读写堵塞> <

PostgreSQL 逻辑订阅 - 给业务架构带来了什么希望?

标签 PostgreSQL , 逻辑订阅 , 10.0 , 数据汇聚 , 数据共享 , IDC多活 , 云端线下同步 背景 逻辑订阅是PostgreSQL 10.0的新特性. 具体的原理,使用方法可以参考如下文章. <PostgreSQL 10.0 preview 逻辑订阅 - 原理与最佳实践> <PostgreSQL 10.0 preview 逻辑订阅 - pg_hba.conf变化,不再使用replication条目> <PostgreSQL 10.0 preview 逻

PgSQL · 应用案例 · 逻辑订阅给业务架构带来了什么?

背景 逻辑订阅是PostgreSQL 10.0的新特性. 具体的原理,使用方法可以参考如下文章. <PostgreSQL 10.0 preview 逻辑订阅 - 原理与最佳实践> <PostgreSQL 10.0 preview 逻辑订阅 - pg_hba.conf变化,不再使用replication条目> <PostgreSQL 10.0 preview 逻辑订阅 - 备库支持逻辑订阅,订阅支持主备漂移了> <PostgreSQL 10.0 preview 逻辑

PostgreSQL服务器管理:服务器设置和操作

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. PostgreSQL用户账户 和对外部世界可访问的任何服务器守护进程一样,我们也建议在一个独立的用户账户下运行PostgreSQL.这个用户账户应该只拥有被该服务器管理的数据,并且应该不能被其他守护进程共享(例如,使用用户nobody是一个坏主意).我们不建议把可执行文件安装为属于这个用户,因为妥协系统可能接着修改它们自己的二进制文件. 要在你的系统中增加一个 Unix 用户账户,查看一个命令useradd或ad