PostgreSQL 提示 ERROR: missing chunk number 0 for toast value 32789 in pg_toast_2619
现象:查询业务表数据提示 ERROR: missing chunk number 0 for toast value 32789 in pg_toast_2619
处理方法:定位到损坏的行的位置,然后删除有问题的行。pg_statistic 的 toast 数据是更新统计信息的时候插入的,损坏后可以直接清理。vacuum analyze 会重新生成。业务表损坏建议将 zero_damaged_pages 设置为 on 来跳过损坏的块,然后重建对象 REINDEX TABLE 然后备份业务数据,之后恢复到一个新的环境进行处理。
postgres=# SELECT * FROM pg_class WHERE oid = 2619;
postgres=# SELECT 2619::regclass;
postgres=# REINDEX TABLE pg_toast.pg_toast_2619;
postgres=# REINDEX TABLE pg_statistic;
postgres=# VACUUM ANALYZE pg_statistic;
使用存储过程查看损坏的行
DO $$
DECLARE
rec record;
BEGIN
FOR rec in SELECT * FROM pg_catalog.pg_statistic LOOP
raise notice 'Parameter is: %', rec.ctid;
raise notice 'Parameter is: %', rec;
END LOOP;
END;
$$
LANGUAGE plpgsql;
postgres=# delete from pg_statistic where ctid= '(16,8)';
直到存储过程没有报错的时候。