1、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.001autovacuum_analyze_scale_factor = 0.001

结果导致如上错误信息:

第二次优化:

autovacuum_vacuum_scale_factor = 0.03autovacuum_analyze_scale_factor = 0.03

问题得到解决

Postgres11.2版本客户端打开column "p.prolang"问题处理

postgres升级到到11版本后,客户端打开会提示

ERROR:column p.proisagg does not exist
LINE 1:...database d on d.datname=current_database() where p.proisagg..
HINT: Perhaps you meant to reference the column "p.prolang"

无法打开函数功能,如下图:

是数据库服务版本高,客户端版本低引起的,通过下载最新pgadmin4-4.6 问题解决。

2、Postgres11.2版本客户端打开column "p.prolang"问题处理

postgres升级到到11版本后,客户端打开会提示

ERROR:column p.proisagg does not exist
LINE 1:...database d on d.datname=current_database() where p.proisagg..
HINT: Perhaps you meant to reference the column "p.prolang"

无法打开函数功能,如下图

是数据库服务版本高,客户端版本低引起的,通过下载最新pgadmin4-4.6 问题解决。

3、Postgres数据库大批量单表导入数据引发性能故障

因公司经营管理策略原因,我们地区部门还是以开发外包和产品服务为主,对测试外包服务销售工作要求占比不高,而测试部门本来有四五个性能测试人员,加上老员工都比较积极做事在测试团队建设管理上不用花费太多精力。估计因为我对数据库、tomcat、linux性能这块了解比较深以前相关的测试环境都是我搭建部署,一直都很稳定,所以公司让我帮忙兼职做公司产品技术运维支持工作,因此我大部分时间都是在做软件产品基础设施搭建研究MYSQL\PG\TOMCAT\Centos等优化配置和数据安全备份方法,作为初学者很多未知领域需要探索学习研究。

这段时间的运维感触是,做为一名技术运维人员需要一个拥有“耐心、静心、探索心、敬业心”,不然心情一爽rm -rf ,后果不敢设想,或者部署配置时日志格式、清理机制、数据存放路径、备份方式没弄好也会导致系统不稳定等问题。

当然有时客户自己也有专职运维人员,但是往往有些技术运维人员,对数据安全等敏感性没那么高,会误操作导致双方一下子手忙脚乱,例如系统缓慢就restart tomcat 或者kill pid 来应急,但是最终的效果是数据不一致或者丢失等现象。例如下面这个问题就是因为客户一下子插入700W笔数据,但是事先没跟我方项目人员沟通导致系统无法正常运行问题。

下午临近下班时,客户突然打电话给我方项目经理说,系统运行很慢,PG数据库服务器卡死,输入top 都要等五六分钟才能响应,但是CPU使用率不高,如下图:

是看到的数据库服务器CPU使用率确实不高,通过free命令

看到内存将耗尽

通过top看到系统调用KSWAPd0,并运行占用时间比较长,于是我让项目经理打电话问客户说在操作什么,是不是在倒数据?

一开始客户说没做任何操作,但是持续监控一段时间查看了内存使用free一直很低,而且kswapd0进程一直被调度使用,

kswapd0进程的作用:它是虚拟内存管理中,负责换页的,操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值,pages_hige 和 pages_low,当空闲内存页的数量低于 pages_low 的时候,kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high,由于内存实在不够用了, 于是就死掉了.

这说明一点客户在做大量数据插入操作,导致内存不足,引发系统卡顿,但是客户那边说没做任何操作,我们也怀疑是不是被安全攻击等,作为初级运维人员思维确实比较混乱,没有那么多经验,当时应急方式先重启数据库后,内存立马释放正常,但是没过几分钟又重现问题,这时我们双方打电话沟通了下,原来客户是有在对一张已有百万级数据量的表做迁移插入操作,插入数据也是百万级,知道原因后,也知道对应的表后,查看了该表发现客户在做操作时没有对该表的索引等先删除在插入操作导致系统就慢慢的死掉了。----这也是项目运维管理规范问题导致的。

PG数据库快速INSERT大量数据

临时删除index

有时候我们在备份和导入大量数据时,这个时候可以先把index删除掉。导入在建index。

4、Postgres异常断电导致启动失败解决方法

问题起因:

前段时间客户生产服务器,突然不小心弄断电了,虽然运维人员重启服务后,看似能正常访问,但是出现主从无法正常同步数据问题,而重新启动服务后,报could not connet to server。。。。postgresql/.s.PGSQL.5432,后台日志出现,accepting TCP/IP connections on port 5432等一串错误信息。突发性断电导致异常终止,这是数据库的postmaster.pid 文件仍健在,但是其实不起作用,在后台数据库日志也可以看到如下错误信息,lock file “postmaster.pid” already exists,这时建议先cp 备份另存下,以防改错,然后在直接mv postmaster.pid 迁移到其他地方 ,然后重启数据库服务,即可解决问题。而启动的时候出现启动失败,具体情况请看下下面的文章:《postgres启动失败问题分析与处理 》

原理分析:

当我们启动PostgresSQL时,会在PostgreSQL中的数据文件夹生成postmaster.pid 文件,该文件主要是记录启动时对应的进程号等相关信息,如果该文件已经存在,在启动时,会导致进程号无法对应,最终启动失败,原理如下:

1、26385: 代表Postgres主进程的PID

2、/home/postgresql_data: 代表数据目录

3、5432: 代表数据库监听端口,在postgresql.conf中对应port = 5432

4、5432001 229376:代表的是共享内存的地址(shared memory segments中的key和shmid)。

5、Postgres启动失败问题分析与处理

很多企业使用开源的操作系统例如centos,也是用开源的数据库例如mysql或者postgres,在安装使用过程中经常出现一些不可预知的错误,导致安装失败或者启动失败等。

例如需要安装gcc 或者最新lib等,也有因为安全控件问题阻挡软件正常安装使用,或者有时平常运行好好的,突然重新启动竟然报错,让人捉摸不清问题原因。

这两天客户一个系统使用postgres数据库,做了主从,但是因为断电问题导致主从数据同步出现问题,该项目经理让我帮忙分析处理,出于个人懒,

就找了17年帮他们项目组搭建的postgre现有设置好的主从测试开发环境,该环境持续运行一年半,一直没出现问题,我想模拟下,客户生产

故障,一个原因是模拟直接kill 主库进程,一个模拟强制断电关机看是否能正常启动,并自动主从数据同步,结果世事难料,在模拟直接kill掉进程后,竟然启动不了,具体错误如下:

看了半天错误信息,看到了ERROR: Unable to open policy
//etc/selinux/targeted/policy/policy.30.

[root@DB1 postgresql_data]# journalctl -xe9月 27 12:43:59 DB1 dbus[784]: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)9月 27 12:43:59 DB1 dbus-daemon[784]: dbus[784]: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)9月 27 12:43:59 DB1 dbus-daemon[784]: ERROR: policydb version 30 does not match my version range 15-299月 27 12:43:59 DB1 dbus-daemon[784]: ERROR: Unable to open policy //etc/selinux/targeted/policy/policy.30.9月 27 12:43:59 DB1 python[9716]: detected unhandled Python exception in '/usr/sbin/setroubleshootd'9月 27 12:43:59 DB1 abrt-server[9721]: Not saving repeating crash in '/usr/sbin/setroubleshootd'9月 27 12:43:59 DB1 dbus-daemon[784]: Traceback (most recent call last):9月 27 12:43:59 DB1 dbus-daemon[784]: File "/usr/sbin/setroubleshootd", line 30, in <module>9月 27 12:43:59 DB1 dbus-daemon[784]: from setroubleshoot.util import log_debug9月 27 12:43:59 DB1 dbus-daemon[784]: File "/usr/lib64/python2.7/site-packages/setroubleshoot/util.py", line 291, in <module>9月 27 12:43:59 DB1 dbus-daemon[784]: from sepolicy import get_all_file_types9月 27 12:43:59 DB1 dbus-daemon[784]: File "/usr/lib64/python2.7/site-packages/sepolicy/init.py", line 798, in <module>9月 27 12:43:59 DB1 dbus-daemon[784]: raise e9月 27 12:43:59 DB1 dbus-daemon[784]: ValueError: Failed to read //etc/selinux/targeted/policy/policy.30 policy file9月 27 12:43:59 DB1 dbus[784]: [system] Activated service 'org.fedoraproject.Setroubleshootd' failed: Launch helper exited with unknown return code 19月 27 12:43:59 DB1 dbus-daemon[784]: dbus[784]: [system] Activated service 'org.fedoraproject.Setroubleshootd' failed: Launch helper exited with unknown return code 19月 27 12:43:59 DB1 dbus-daemon[784]: dbus[784]: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)9月 27 12:43:59 DB1 dbus[784]: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)9月 27 12:43:59 DB1 fprintd[9127]: ** Message: No devices in use, exit9月 27 12:43:59 DB1 dbus-daemon[784]: ERROR: policydb version 30 does not match my version range 15-299月 27 12:43:59 DB1 dbus-daemon[784]: ERROR: Unable to open policy //etc/selinux/targeted/policy/policy.30.

修改selinux 比较麻烦,时间有限,我选择流氓做法,直接设置SELINUX=disabled,然后在重新启动postgres,竟然报数据文件目录权限问题,如下:

9月 27 12:37:26 DB1 systemd[1]: Starting PostgreSQL 9.5 database server...9月 27 12:37:26 DB1 pg_ctl[3560]: < 2018-09-27 12:37:26.211 CST >FATAL: data directory "/home/postgresql_data" has group or world access9月 27 12:37:26 DB1 pg_ctl[3560]: < 2018-09-27 12:37:26.211 CST >DETAIL: Permissions should be u=rwx (0700).9月 27 12:37:27 DB1 pg_ctl[3560]: pg_ctl: 无法启动服务器进程9月 27 12:37:27 DB1 pg_ctl[3560]: 检查日志输出.9月 27 12:37:27 DB1 systemd[1]: postgresql-9.5.service: control process exited, code=exited status=19月 27 12:37:27 DB1 systemd[1]: Failed to start PostgreSQL 9.5 database server.9月 27 12:37:27 DB1 systemd[1]: Unit postgresql-9.5.service entered failed state.9月 27 12:37:27 DB1 systemd[1]: postgresql-9.5.service failed.

根据错误信息提示,信息给得很详细,postgresql的数据文件权限被改了,现在不是0700(只有用户权限)。

重新 chmod 700 -R 赋权后重启,问题解决,启动成功,该数据库运行接近两年,一直相安无事,这次竟然报该错误信息。

参考连接 :
五个 PostgreSQL 典型故障案例及处理 :https://mp.weixin.qq.com/s/tMSRMZgAHaE1cBE0Yb2X6w

PostgreSQL数据库错误:检测到ShareLock死锁处理
http://www.talkwithtrend.com/Article/244327
postgres11.2版本客户端打开column "p.prolang"问题处理
http://www.talkwithtrend.com/Article/244473
postgres数据库大批量单表导入数据引发性能故障
http://www.talkwithtrend.com/Article/244493
postgres异常断电导致启动失败解决方法
http://www.talkwithtrend.com/Article/244507
postgres启动失败问题分析与处理
http://www.talkwithtrend.com/Article/244511

五个 PostgreSQL 典型故障案例及处理相关推荐

  1. 交换机组网典型故障案例及处理思路

    一.交换机刚加电时网络无法通信 故障现象:交换机刚刚开启的时候无法连接至其他网络,需要等待一段时间才可以.另外,需要使用一段时间之后,访问其他计算机的速度才快,如果有一段时间不使用网络,再访问的时候速 ...

  2. 大型网站典型故障案例分析

    写日志也会引发故障 故障现象:某应用服务器集群发布后不久就出现多台服务器相继报警,硬盘可用空间低于警戒值,并且很快有服务器宕机,登录到线上服务器,发现log文件夹里的文件迅速增加,不断消耗磁盘空间. ...

  3. CPU的典型故障剖析

    电脑故障急救系列之一:CPU的典型故障剖析 玩电脑的朋友肯定都会遇到电脑故障,虽然它们千奇百怪,但与之关联的不外乎那几个重要的硬件,比如:CPU.硬盘.内存.显卡等.不过大部分故障都是由用户一时疏忽而 ...

  4. 计算机故障分析与处理事例,几个典型CPU故障案例的处理方法

    CPU作为电脑的核心组成部份,它的好坏直接影响到电脑的性能.CPU有时会发生故障,那么,下面让学习啦小编带您去看看几个典型的案例的处理方法吧. 几个典型CPU故障案例的处理方法: 一般情况下,CPU出 ...

  5. Netty消息接收类故障案例分析

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty消息接收类故障案例.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同 ...

  6. 空调系统故障类型与故障案例集

    一.制冷系统故障类型 脏堵:一般发生在毛细管的进口处,是因系统内的污物(如焊渣.锈宵.氧化皮等)堵塞了管路,检查时轻轻敲击毛细管处可能会暂时恢复正常,另从管路和元件表面凝露.结霜以及停机时压力恢复速度 ...

  7. UPS电池异常故障案例

    近日在市电切换过程中遇到UPS和备用电池组同时出现故障案例现总结后分享给大家. 故障现象:UPS在市电切换过程中输入电源中断,工作状态由电池逆变异常切换至旁路供电状态,同时UPS机组面板出现母线电压异 ...

  8. 数据中心空调故障案例集(第二季)

    一.蓄冷罐氮封装置故障 故障现象:冬季,某蓄冷罐内出现压力异常告警. 故障原因:环境温度过低,导致隔膜阀被冻结,失去调节作用. 对策:需对隔膜阀进行保温. 氮封装置故障 二.冷机发生喘振 故障现象:冷 ...

  9. 资源放送丨《高并发Oracle OLTP系统的故障案例分享》PPT视频

    点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请资深专家 邓秋爽 老师分享了<高并发Oracle OLTP系统的故障案例分享>,在这里我们将课件PPT和实 ...

最新文章

  1. Vue.js示例:GitHub提交(watch数据,created钩子,filters过滤); 网格组件(功能:1.检索,2排序);...
  2. 自建服务器 下bt,使用Docker安装OpenTracker,自建BT Tracker服务器
  3. [No0000178]改善C#程序的建议1:非用ICloneable不可的理由
  4. 95-50-040-java.nio.channels-NIO-NIO之Buffer(缓冲区)
  5. 各种对话框 Dialog
  6. 分享17个网页设计中字体排版的优秀示例
  7. 层次聚类 簇数_聚类(一):K-means、层次、DBSCAN、均值漂移、K-Means 与 KNN
  8. rownum与order by
  9. 用户故事与敏捷方法知识点梳理
  10. 【源码分享】短信平台插件74cms_v4.1_骑士人才系统
  11. 小学计算机教师面试试题及答案,2019上半年小学信息技术教师资格证面试试题及答案(精选)第一批...
  12. ES6: 模板字符串
  13. html动态背景分享,酷炫一款动态背景(HTML +js canvas)
  14. 第 2 课:KNX智能控制系统的接口 BCU 模块
  15. 最新小象学院python量化交易项目实战(完整)
  16. 苹果公司发展史_苹果公司的发展历史
  17. 使用ipv6-test.com测试服务器域名是否支持IPV6
  18. 什么是FDR校正,核磁共振成像中FDR校正方法有哪些?如何进行FDR校正?
  19. 海尔简爱s11怎么进入bios_海尔简爱s11系统应用商店没有登录界面怎么办?
  20. 微信公众平台测试号——模板消息发送Demo

热门文章

  1. 基于情感词典、k-NN、Bayes、最大熵、SVM的情感分析比较及优缺点
  2. yolov5论文叫什么_熬夜写论文是一种怎样的体验
  3. swing获取文本框内容_Swing 使用 JTable详解
  4. python text insert()背景色_50行python代码写个计算器教程
  5. python画图小实例_python绘图实例
  6. mysql数据库在哪里写语句_Mysql数据库操作语句
  7. 激战2:逐火之路-概念艺术设计
  8. clipboardjs 基本使用方式之一
  9. deepin/Ubuntu搭建FTP/SFTP
  10. 值得推荐的WEB版报表工具-报表设计器