数据库因坏块导致无法VACUUM FREEZE问题处理

文章目录

环境

系统平台:N/A

版本:4.5.8,4.5.7,4.5.6,6.0

症状

数据库因事务年龄达到21亿,导致事务冻结,无法进行增删改。 数据库日志中提示:

复制代码
<2025-05-13 13:55:41.693 CST app:[未知] db:db_1 pid:2869609 state:54000 tran:0 sessiontime:2025-05-13 13:55:21 CST>语句:  INSERT INTO table xxx values xxx
<2025-05-13 13:55:41.693 CST app:[未知] db:db_1 pid:2869611 state:54000 tran:0 sessiontime:2025-05-13 13:55:21 CST>错误:  数据库没有接收命令来避免在数据库"db_1"中的重叠数据损失
<2025-05-13 13:55:41.693 CST app:[未知] db:db_1 pid:2869611 state:54000 tran:0 sessiontime:2025-05-13 13:55:21 CST>提示:  停止postmaster进程,然后在单用户模式下清理数据库.
	您也可能需要提交或回滚旧的已准备好事务,或者旧的复制槽.
。。。
<2025-05-13 13:57:26.035 CST app: db: pid:2870085 state:XX001 tran:0 sessiontime:2025-05-13 13:55:23 CST>错误:  无法读取文件"base/16387/220001"的块0:只读取了8192字节的0
<2025-05-13 13:57:26.035 CST app: db: pid:2870085 state:XX001 tran:0 sessiontime:2025-05-13 13:55:23 CST>上下文:  对表"db_1.public.table_namexxx"进行自动清理

问题原因

数据文件所在的磁盘或文件系统可能出现物理损坏或存储错误,导致块损坏,数据库无法对相关表进行事务年龄回收。

解决方案

  1. 检查坏块对应的数据库对象
    以数据库文件base/16387/220001 为例:
sql 复制代码
select * from pg_database where oid = '16387';

数据库名称为db_1,则切换到db_1查询对应对象名称、类型等信息。

sql 复制代码
select oid,relname,relnamespace,relkind from pg_class where relfilenode = 220001;   
  1. 坏块对象处理

2.1 假如对象为索引:

寻找合适时间,删除和重建索引。

2.2 假如对象为表

寻找合适时间,配置zero_damaged_pages=on,使用pg_dump导出数据,重新建表后导入。 注意:修改该参数前,强烈进行数据库的完整物理备份。

sql 复制代码
alter system set zero_damaged_pages = on;
select pg_reload_conf();

关于zero_damaged_pages参数介绍,请参考:

059921204 PostgreSQL坏块忽略参数的介绍

假如坏块较多,则建议重建实例后,进行全库导入,注意排查硬盘和文件系统是否存在IO错误。

  1. 再次进行事务ID回收

完成表重建或索引重建后,需要手动进入单用户模式,执行

sql 复制代码
VACUUM FREEZE ;

单用户模式,请参考:

瀚高技术支持平台:012067504 瀚高数据库的单用户模式介绍 postgres --single

相关推荐
城管不管8 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
倔强的石头1068 小时前
向量数据库从相似度检索走向融合数据底座
数据库
今天AI了吗9 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
lilian23310 小时前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
皮卡丘不断更10 小时前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率
保卫大狮兄11 小时前
设备管理从台账到报废,完整生命周期一次讲清
数据库·设备管理·设备
数据安全技术观察12 小时前
数据动态脱敏:让脱敏策略跟着数据目录走
大数据·网络·数据库
小席是个热心肠12 小时前
Redis的自我学习
数据库·redis·学习
2601_9657984713 小时前
Salient Theme Setup Guide for Fast Creative WordPress Sites
数据库·web3·php·wordpress
@Mike@13 小时前
09-数据库学习笔记(数据库索引与过滤器)
数据库·笔记