当前位置: 首页 > news >正文

现场问题排查-postgresql某表索引损坏导致指定数据无法更新影响卷宗材料上传

问题现象

今天突然被拉进一个群,说某地区友商推送编目结果报错,在我们自己的卷宗系统上传材料也一直转圈,也删除不了案件卷宗,重置模板也没用,只有个别案件有问题。虽然这事儿不属于我负责,但还是抽时间给看了一眼,其实问题很简单,就是索引损坏了,估计之前有过异常断电之类的场景导致的,在这里记录一下。

排查过程

首先要来环境信息,并复现问题,通过浏览器F12控制台观测,指定案件上传卷宗任意材料时后端上传材料接口都会稳定返回一个数据库错误,关键字是“PSQLException: ERROR: index idx_ws_xxx contains unexpected zero page at block 1280517 Hint: Please REINDEX it.”。
错误提示其实已经很明显了,就是说索引损坏了,建议重建索引。所以就直接告诉现场重建索引就行了,考虑到现场版本比较低(PG9.6.3)不支持REINDEX CONCURRENTLY,给现场写了类似以下脚本让其执行后观察:

-- 查询索引定义脚本,供后续重建索引使用(第一列就是索引创建脚本)
SELECT indexdef, * FROM pg_indexes where indexname = 'idx_ws_xxx';
-- 删除损坏的索引
DROP INDEX idx_ws_xxx;
-- 在索引定义脚本中加上CONCURRENTLY关键字,防止创建索引时阻断表业务操作,毕竟有问题的数据很少,正常业务很多
CREATE INDEX CONCURRENTLY idx_ws_xxx ...;

好几个小时后问现场,现场答复还在执行中,虽然这个表有五千万的数据量,但也不至于这么慢吧?

-- 使用以下脚本查询数据库所有连接情况
select * from pg_stat_activity;
-- 使用以下脚本确认在运行的连接情况
select datname, pid, application_name, backend_start, wait_event_type, query, * from pg_stat_activity;

上面脚本能看到两个关键连接,一个是删除索引的脚本处于激活状态,且一直在等待锁,另一个是重建索引的表上有个autovacuum在跑且开始时间确实在drop索引的脚本之前,所以不需要再追踪具体锁进程也能猜出来该表自动清理任务影响了索引重建。

-- 先暂停该表的自动清理选项
alter table t_ws set (autovacuum_enabled = false);
-- 再杀掉该表的自动清理任务(自动清理是带事物的,杀掉只会导致数据回滚,不会损坏表)
select pg_terminate_backend(任务连接的pid);

上面脚本执行完发现还是会锁定,再次观察pg_stat_activity结果发现pg自动拉起来一个新的进程继续跑autovacuum。

-- 暂停数据库级别的自动清理选项
alter system set autovacuum = off;
-- 刷新配置,不用重启数据库
select pg_reload_conf();
-- 也可以用 show autovacuum 语句查看当前生效的配置值-- 删除索引并重建索引-- 恢复数据库级别的自动清理选项
alter system set autovacuum = on;
-- 刷新配置,不用重启数据库
select pg_reload_conf();

再次验证,搞定!

参考资料

PG9.6 REINDEX命令:http://postgres.cn/docs/9.6/sql-reindex.html
PG12 REINDEX命令:http://postgres.cn/docs/12/sql-reindex.html

相关文章:

  • 97A6-ASEMI无人机专用功率器件97A6
  • 【神经网络与深度学习】端到端方法和多任务学习
  • 2025系统架构师---事件驱动架构
  • Android10.0 Android.bp文件详解,以及内置app编写Android.bp文件
  • iOS自定义电池电量显示控件 BatteryView 实现
  • uniapp自定义一个选择年月日时分的组件。
  • SpringBoot驾校报名小程序实现
  • 重构数字信任基石:Java 24 网络安全特性的全维度革新与未来防御体系构建
  • List 的介绍 [数据结构 初阶]
  • OceanBase数据库-学习笔记2-C#/C++程序如何访问
  • error mounting 报错解决办法
  • 【Android】dialogX对话框框架
  • 数值分析、数值代数之追赶法
  • 高功率无人机动力方案首选:CKESC ROCK 220A-H CAN 电调工程性能实测
  • AI-Browser适用于 ChatGPT、Gemini、Claude、DeepSeek、Grok的客户端开源应用程序,集成了 Monaco 编辑器。
  • Web安全:威胁解析与综合防护体系构建
  • vscode vue 的插件点击组件不能跳转到文件问题解决
  • 人工智能——XGBoost 算法
  • 如何启动jar包隐藏cmd窗口
  • k8s生成StarRocks集群模版
  • 江西省国资委原副主任李键主动向组织交代问题,接受审查调查
  • 江西省宁都县政协原二级调研员谢亦礼被查
  • 乌克兰基辅遭大规模袭击,已致12人死亡
  • 著名茶叶专家谢丰镐逝世,享年95岁
  • 宁德时代与广汽等五车企发布10款巧克力换电新车型:年内将完成30城1000站计划
  • 主动权益基金一季度重仓股出炉:腾讯跃升至第一,阿里、比亚迪、中芯国际新进前十