PostgreSQL 数据库检测到 ShareLock 死锁的处理方法

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] - org.apache.shiro.web.servlet.ShiroHttpSession@
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] - org.apache.shiro.web.servlet.ShiroHttpSession@
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

问题得到解决

参考连接 :
PostgreSQL 数据库检测到 ShareLock 死锁的处理方法 :https://mp.weixin.qq.com/s/iGnRKIavnG0Q9TiGXVl1rg

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一个非常流行的开源关系型数据库,如果你想升级到10版本以上,可以按照以下步骤进行: 1. 备份数据 在进行任何升级操作之前,务必先备份数据库数据。你可以使用pg_dump工具来备份数据,例如: ``` pg_dump mydatabase > mydatabase_backup.sql ``` 这会将mydatabase数据库备份到mydatabase_backup.sql文件中。请确保备份文件妥善保存。 2. 安装新版本 在升级之前,你需要先安装新版本的PostgreSQL数据库。你可以从官方网站下载最新版本的PostgreSQL。 在安装过程中,你需要选择升级已有的PostgreSQL数据库。如果你的系统中已经安装了旧版本的PostgreSQL,安装程序将会自动检测到它,并提供升级选项。 3. 升级数据库 安装完成后,你需要使用pg_upgrade工具来升级数据库。此工具会将旧版本的数据库升级到新版本。 具体升级步骤如下: - 停止PostgreSQL服务器 在升级之前,你需要停止PostgreSQL服务器。你可以使用以下命令停止服务器: ``` sudo systemctl stop postgresql ``` - 执行pg_upgrade 执行以下命令来运行pg_upgrade: ``` sudo pg_upgrade -b /usr/lib/postgresql/9.6/bin/ -B /usr/lib/postgresql/10/bin/ -d /var/lib/postgresql/9.6/main/ -D /var/lib/postgresql/10/main/ -o '-c config_file=/etc/postgresql/9.6/main/postgresql.conf' -O '-c config_file=/etc/postgresql/10/main/postgresql.conf' ``` 这个命令中包含了许多选项,其中: -b:指定旧版本的PostgreSQL二进制文件路径 -B:指定新版本的PostgreSQL二进制文件路径 -d:指定旧版本的数据目录路径 -D:指定新版本的数据目录路径 -o:用于指定旧版本的postgresql.conf配置文件路径 -O:用于指定新版本的postgresql.conf配置文件路径 - 重启PostgreSQL服务器 升级完成后,你需要启动新版本的PostgreSQL服务器。你可以使用以下命令启动服务器: ``` sudo systemctl start postgresql ``` 4. 检查升级结果 升级完成后,你需要检查数据库是否正常运行。你可以使用以下命令来连接到数据库: ``` psql mydatabase ``` 然后输入数据库密码即可。如果一切正常,你应该能够看到连接成功的提示信息。 在连接到数据库后,你可以执行一些SQL语句来检查数据库是否正常。例如: ``` SELECT version(); ``` 这个命令应该返回新版本的PostgreSQL数据库信息。如果一切正常,恭喜你已成功将PostgreSQL数据库升级到10版本以上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值