postgresql 死锁处理

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

缘起

遇到一个奇怪的现象,select和delete表时正常执行,但truncate和drop表时会一直运行,也不报错。

原因

"drop table " 和 "truncate table " 需要申请排它锁 "ACCESS EXCLUSIVE ", 执行这个命令卡住时,说明此时这张表上还有操作正在进行,比如查询等,
那么只有等待这个查询操作完成,"drop table" 或"truncate table"或者增加字段的SQL 才能获取这张表上的 "ACCESS EXCLUSIVE" 锁 ,操作才能进行下去。

1.检索出死锁进程的ID。

select oid,relname from pg_class where relname='all_data';

检索出来的字段中,【wating 】字段,数据为t的那条,就是死锁的进程。找到对应的【procpid 】列的值。

2.将进程杀掉。

SELECT pg_cancel_backend('死锁那条数据的procpid值 ');

结果:运行完后,再次更新这个表,sql顺利执行。

 

如果pg_stat_activity 没有记录,则查询pg_locks是否有这个对象的锁

 

select locktype,pid,relation,mode,granted,* from where relation= '上面查询出来的oid';

杀掉进程

select pg_cancel_backend('进程ID');

另外pg_terminate_backend()函数也可以杀掉进程。

总结

select oid,relname from pg_class where relname='all_data';
select locktype,database,pid,relation ,mode from pg_locks where relation=上面oid;
select * from pg_stat_activity where pid = 上面pid
select pg_terminate_backend(上面pid);

删除数据库说被链接

异常

db_v43=> drop database test_db;
ERROR:  database "test_db" is being accessed by other users
DETAIL:  There is 1 other session using the database.

解决

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='数据库名' AND pid<>pg_backend_pid(); 

然后就可以删除数据库了

 

查看表结构依赖

在表结构修改(增删改)利于排除死锁

批量删除

把pid拷贝到del文件

cat del |sort | uniq | awk '{print "select pg_terminate_backend("$1");"}'

 




本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/5434358.html,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
SQL 存储 Oracle
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
快速学习19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
|
SQL XML 关系型数据库
RDS SQL Server死锁(Deadlock)系列之五利用Extended Events获取死锁信息
# 问题引入 在过去很长一段时间,不断有客人会问道:“在事先没有任何跟踪或者监控部署的情况下,阿里云RDS SQL Server有没有办法获取到历史死锁信息,供我们分析?”。在写到RDS SQL Server死锁系列文章之五时,我们就可以使用Extended Events来解决这个问题。 # 分析问题 Extended Events是微软从SQL Server 2008版本开始引入的,其中有
3674 0
|
关系型数据库 PostgreSQL 监控
PostgreSQL高并发单行更新发生死锁
之前的一篇博客《PostgreSQL分区表的性能损耗验证》中,遇到100并发单行更新发生死锁(问题1)的问题。 这么简单的一条SQL,100个并发时居然会发生死锁,太不可思议了。发生死锁的SQLupdate_smallrange.
2270 0
|
SQL 关系型数据库 Go
RDS SQL Server死锁(Deadlock)系列之一使用DBCC捕获死锁
RDS SQL Server死锁(Deadlock)系列之一使用DBCC捕获死锁http://www.bieryun.com/4528.html 问题引入 在日常运维阿里云RDS SQL Server产品过程中,经常会被客户问道:“应用程序被死锁报错啦?影响很大,到底是哪个进程导致了死锁发生的啊?怎么解决啊?怎么办呀?”。
1671 0
|
SQL 关系型数据库 Go
RDS SQL Server死锁(Deadlock)系列之四利用Service Broker事件通知捕获死锁
# 问题引入 在前面三篇文章,我们分别谈到了[使用DBCC命令捕获死锁](https://yq.aliyun.com/articles/73856?spm=5176.8091938.0.0.rjljJx);[使用Profiler界面跟踪Deadlock Graph事件捕获死锁](https://yq.aliyun.com/articles/73951?spm=5176.8091938.0.0.o
3549 0
|
SQL 关系型数据库 Go
RDS SQL Server死锁(Deadlock)系列之三自动部署Profiler捕获死锁
# 问题引入 系列SQL Server死锁系列文章之二,讲的是如何手动部署Profiler来捕获死锁以及对死锁发时场景重现,这篇文章是将这个手动部署的过程自动化话,实现一键部署,既快捷方便,又简单适用。上一篇文章,参见:[使用Profiler捕获死锁](https://yq.aliyun.com/articles/73951?spm=5176.8091938.0.0.oDXHeW)。 # 自动
3583 0
|
SQL 关系型数据库 RDS
RDS SQL Server死锁(Deadlock)系列之二使用Profiler捕获死锁
# 问题引入 不管是RDS SQL Server还是自建SQL Server数据库,死锁的确是一个非常头疼的问题,上一篇文章我们已经谈到了[使用DBCC捕获死锁](https://yq.aliyun.com/articles/73856?spm=5176.8091938.0.0.rjljJx)。这篇文章是以阿里云RDS客户遇到的死锁问题为背景,分享死锁文章系列之二使用Profiler捕获死锁。
6478 0
|
Web App开发 关系型数据库 数据库
PostgreSQL/PPAS 一例死锁问题分析
PostgreSQL 死锁问题 本文分析在 PostgreSQL 发生的一例死锁问题 执行SQL 序列 表结构和数据 create table a(id int, value int); insert into a values(1,1); insert into
6014 0