missing chunk number 0 for toast value 3225264 in pg_toast_1582256

参考:https://blog.csdn.net/qq_36439930/article/details/87257276/

 

问题原因:某张表关联的toast表的data发生损坏。

解决方案:

    toast是The OverSized Attribute Storage Technique(超尺寸字段存储技术)的缩写,是超长字段在HighgoDB的一种存储方式。当某表中的超长字段的时候,那这个表会有与之相关联的Toast表。根据toast表的命名规则,假设存在表test的oid为2867,那么如果存在与之相关联的toast表,toast表名为pg_toast_2867。(这个要看你报错的表名是2619还是其他的 什么 我出的就是2619,在客户端连服务器时候报的)

 

 

再总结一下,有3种情况:

1、pg_statistic 损坏,这里面应该是柱状图或者mcv的结果太大了导致的。重建这个表应该能解决。

1)通过toast的表名pg_toast_2619查询出哪张表出现了问题:

select 2619::regclass;

REINDEX table pg_toast.pg_toast_2619;

REINDEX table pg_statistic;

VACUUM ANALYZE pg_statistic;

 

2、表数据的toast值有损坏,就需要通过一条一条遍历的方式找到有问题的行,进行删除或者修复。

我再删除完后 继续select * from club 仍然报上面的错误, 然后索引重建了也不行,但是select * from club limit xxx 没问题,于是先将所有的clubid 查询出来放在文档里面,用二分法select * from club limit xxx,找到有问题的那一条club数据,看club表里面的字段,看看哪个可能是会很长的,我找到后处理了下 然后问题解决了

DO $$

declare

 v_rec record;

BEGIN

for v_rec in SELECT * FROM test loop

        raise notice 'Parameter is: %', v_rec.ctid;

raise notice 'Parameter is: %', v_rec;

end loop; 

END;

$$

LANGUAGE plpgsql;

NOTICE:  00000: Parameter is: (46,9)

ERROR:  XX000: missing chunk number 0 for toast value 30982 in pg_toast_2619

CONTEXT:  PL/pgSQL function inline_code_block line 7 at RAISE

 

delete from pg_statistic where ctid ='(46,9)';

 

 

 

3、业务表中大对象频繁删除、更新、插入,导致pg_toast中的表在查询的时候,其实已经被删除了,就报错,目前还在想办法解决:

 

posted @ 2022-08-08 21:05  狂神314  阅读(1386)  评论(0编辑  收藏  举报