pg数据库错误:检测到sharelock死锁处理(代码片段)

author author     2022-12-02     608

关键词:

PostgreSQL 是一个免费数据库,对于处理分析型+交易型混合型系统来说确实很不错,特别是版本的升级到11.2后性能提升很多,很多运行机制跟oracle越来越接近,确实很强大,但是开源系统确实存在一些不如意地方,需要长时间项目问题集锦积累才能慢慢的领悟。 而作为从非功能测试转型做技术运维,在运维过程中会从非功能方面(高可用性、高可靠性、可扩展性等)和性能测试优化方面考虑确实可以避免很多生产不必要的故障问题,但是对于开源的技术在版本迭代过程中总会有些不如意的技术故障还是需要我们自己持续性学习、挖掘、积累、提升,才能确保技术能持续满足业务运营发展和市场需求。 如下问题是我们17年上线的系统,经2年的运行,很多业务表达到千万级,导致需要读写分离、分表等来优化,但是问题还是偶尔出现,说明技术还不到位,例如如下:

问题原因:
目前生产环境使用postgres9.5版本,主从配置,但是因为行业业务的特殊性,有些回访表等都是三四百万级别的,而且日常更新频繁度非常高,日常使用频繁比较高的表,一天insert、update都是接近十万,delete三四万以上,导致在对该表的统计信息不准确,而pg默认 autovacuum默认参数导致部分表因本身存量数据大,更新比例小,导致这些日常被用到的大表反而没办法被重新统计分析,最终导致磁盘IO 高,CPU 高问题,而因为在调整过程中调整不当也导致如下,在对表进行批量update 时,而PG就进行 autovacuum_analyze,结果导致出现 ShareLock错误,具体错误如下:
错误内容:

2019-04-14 15:15:47,707 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - 2-
2019-04-14 15:15:47,707 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - [email protected]
461f4ab1
2019-04-14 15:16:15,952 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - 2-
2019-04-14 15:16:15,952 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - [email protected]
285d498f
2019-04-14 15:16:18,138 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - 1-61322fb9-7ca7-482b-99ee-913074957a94
2019-04-14 15:16:24,227 ERROR [500.jsp] -

Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 检测到死锁

详细:进程6533等待在事务 36964707上的ShareLock; 由进程10733阻塞.
进程10733等待在事务 36964708上的ShareLock; 由进程6533阻塞.
建议:详细信息请查看服务器日志.
在位置:当更新关系"visit_crd"的元组(11314, 33)时

The error may involve defaultParameterMap

The error occurred while setting parameters

SQL: UPDATE visit_crd SET visit_plan_id = ?, customer_number = ?, call_id = ?, time_start = ?, time_end = ?,

duration = ?, type = ?, route = ?, cpn = ?, cdpn = ?, recording = ?, trunk_number = ?, update_by = ?, updat
e_date = ?, remarks = ?, affiliation = ?, update_ind = ?, execute_ind = ? WHERE id = ?

Cause: org.postgresql.util.PSQLException: 错误: 检测到死锁

详细:进程6533等待在事务 36964707上的ShareLock; 由进程10733阻塞.
进程10733等待在事务 36964708上的ShareLock; 由进程6533阻塞.
建议:详细信息请查看服务器日志.
在位置:当更新关系"visit_crd"的元组(11314, 33)时
; SQL []; 错误: 检测到死锁
详细:进程6533等待在事务 36964707上的ShareLock; 由进程10733阻塞.
进程10733等待在事务 36964708上的ShareLock; 由进程6533阻塞.
建议:详细信息请查看服务器日志.
在位置:当更新关系"visit_crd"的元组(11314, 33)时; nested exception is org.postgresql.util.PSQLException: 错误: 检测到死锁
详细:进程6533等待在事务 36964707上的ShareLock; 由进程10733阻塞.
进程10733等待在事务 36964708上的ShareLock; 由进程6533阻塞.
建议:详细信息请查看服务器日志.
在位置:当更新关系"visit_crd"的元组(11314, 33)时
org.springframework.dao.DeadlockLoserDataAccessException:
问题分析
PG 默认 autovacuum
1、autovacuum_vacuum_threshold:默认50
2、autovacuum_vacuum_scale_factor默认值为20%。
3、autovacuum_analyze_threshold:默认50。
4、autovacuum_analyze_scale_factor默认10%

第一次优化:
 autovacuum_vacuum_scale_factor = 0.001

autovacuum_analyze_scale_factor = 0.001
结果导致如上错误信息:

第二次优化:
     autovacuum_vacuum_scale_factor = 0.03
autovacuum_analyze_scale_factor = 0.03

    问题解决

ora-00060:等待资源时检测到死锁的一种处理方法

先执行脚本:SELECT  p.sipid,      a.serial#,      c.object_name,      b.session_id,      b.oracle_username,      b.os_user_nameFROM   v$processp,v$sessiona,v$locked_objectb,all_objectscWHERE  p.addr=a.paddr 查看详情

记一次pg_rman备份postgresql数据库报段错误的处理过程(代码片段)

作者:瀚高PG实验室(HighgoPGLab)-徐云鹤数据库备机前期稳定执行备份操作,成功无报错。近期发现pg_rman无法完成备份,提示段错误并产生core文件。通过执行pg_rmandebug模式定位到checkpoint后发生错误。postgres@... 查看详情

记一次pg_rman备份postgresql数据库报段错误的处理过程(代码片段)

作者:瀚高PG实验室(HighgoPGLab)-徐云鹤数据库备机前期稳定执行备份操作,成功无报错。近期发现pg_rman无法完成备份,提示段错误并产生core文件。通过执行pg_rmandebug模式定位到checkpoint后发生错误。postgres@... 查看详情

pg client.on('error' 没有检测到网络中断

...间】:2019-04-1817:06:50【问题描述】:我的应用程序连接到数据库并侦听事件,因此它可以执行事件。如果与数据库的连接断开,那么它应该能够通过consumer.db.on(\ 查看详情

ORA-00060: 等待资源时检测到死锁

...,旨在同时执行。所有脚本都在表上执行更新。我收到了错误,ORA-00060:检测到死锁等待资源当我搜索这个时,我发现,h 查看详情

(王道408考研操作系统)第二章进程管理-第四节3:死锁处理策略之检测和解除

文章目录一:死锁检测算法(1)资源分配图(2)死锁定理二:死锁解除算法如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就极有可能发生死锁,在这种情况下系统应当提供两个算法:死锁检测算法:用... 查看详情

管程死锁

...算法【略,详细见视频7min56s】2.4.4死锁的处理策略--检测和解除死锁的检测数据结构算法死 查看详情

死锁的处理策略—预防死锁避免死锁检测和解除死锁

一、死锁的处理策略——预防死锁(一)破坏互斥条件互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如:SPOOLing技术。... 查看详情

死锁的处理策略—预防死锁避免死锁检测和解除死锁(代码片段)

一、死锁的处理策略——预防死锁(一)破坏互斥条件互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如:SPOOLing技术。... 查看详情

死锁的处理策略—预防死锁避免死锁检测和解除死锁(代码片段)

一、死锁的处理策略——预防死锁(一)破坏互斥条件互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如:SPOOLing技术。... 查看详情

计算机操作系统死锁--产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

....产生死锁的必要条件3.死锁的处理方法3.1鸵鸟策略3.2死锁检测与死锁恢复3.2.1每种类型一个资源的死锁检测3.2.2每种类型多个资源的死锁检测3.3死锁预防3.3.1破坏互斥条件3.3.2破坏请求并持有条件3.3.3破坏不可剥夺条件3.3.4破坏循环... 查看详情

计算机操作系统死锁--产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

....产生死锁的必要条件3.死锁的处理方法3.1鸵鸟策略3.2死锁检测与死锁恢复3.2.1每种类型一个资源的死锁检测3.2.2每种类型多个资源的死锁检测3.3死锁预防3.3.1破坏互斥条件3.3.2破坏请求并持有条件3.3.3破坏不可剥夺条件3.3.4破坏循环... 查看详情

第七章死锁

...银行家算法:数据结构具体实现安全算法例子 死锁的检测和恢复检测算法死锁的处理人工处理 进程终止资源抢占  查看详情

SQL 错误“在批处理结束时检测到不可提交的事务”,数据库上没有事务

】SQL错误“在批处理结束时检测到不可提交的事务”,数据库上没有事务【英文标题】:SQLError"uncommittabletransactionisdetectedattheendofbatch"withouttransactionsondb【发布时间】:2014-07-1612:14:49【问题描述】:我在代码的不同点面临... 查看详情

oracle死锁的检测查询及处理

 --死锁查询语句SELECTbs.username"BlockingUser",bs.username"DBUser",ws.username"WaitingUser",bs.SID"SID",ws.SID"WSID",bs.serial#"Serial#",bs.sql_address"address",bs.sql_hash_value"Sqlhash",bs.program"Bl 查看详情

数据库死锁怎么处理

参考技术A1、SQLServer自动处理,数据库产生死锁时,SQLServer通过锁监视器的捕获死锁信息,并根据一定的规则自动选择一个SQL作为锁的牺牲品,然后与另一个进程死锁在lock资源上,且该事务已被选作死锁牺牲品,然后重新运行该... 查看详情

如何在单个进程中模拟 SQL Server 中的死锁?

...,等待一段时间,然后重试请求最多5次。重试逻辑根据错误号1205检测死锁。我的目标是测试各种存储过程中的死锁重试逻辑和死锁处理。我可以使用两个不同的连接创建死锁。但是,我想在单个存储过程 查看详情

死锁处理

...####################################在实际生产中存在很多情况在数据库里查杀session的方式不能解决死锁问题导致死锁还在所以需要使用在系统里查找spid查杀进程的方式处理死锁############################################################################... 查看详情