查询表报错:missing chunk number %d for toast value %u in pg_toast_XXXX
问题现象
查询表报错:missing chunk number %d for toast value %u in pg_toast_XXXX。
原因分析
表关联的toast表的data发生损坏。
toast是The OverSized Attribute Storage Technique(超尺寸字段存储技术)的缩写,是超长字段在GaussDB(DWS)的一种存储方式。当某表中有超长字段的时候,那么该表会有与之相关联的toast表。根据toast表的命名规则,假设存在表名为test的OID为2619,那么如果存在与之相关联的toast表,则toast表名为pg_toast_2619。此报错中pg_toast_2619非固定表名,可根据实际报错对pg_toast_2619进行替换。
处理方法
- 通过toast的OID(示例中为2619,来源于报错信息的pg_toast_2619)查询出哪张表发生了损坏:
1 2 3 4 5
SELECT 2619::regclass; regclass -------------- pg_statistic (1 row)
- 对已定位的损坏表(步骤1中查询得到的表pg_statistic),执行REINDEX和VACUUM ANALYZE操作。显示REINDEX/VACUUM,表示修复完成。如果修复过程中出现报错,请继续执行步骤3。
1 2 3
REINDEX table pg_toast.pg_toast_2619; REINDEX table pg_statistic; VACUUM ANALYZE pg_statistic;
- 执行以下的命令定位该表中损坏的数据行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
DO $$ declare v_rec record; BEGIN for v_rec in SELECT * FROM pg_statistic 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
- 将步骤3中定位的损坏数据行记录删除。
1
DELETE FROM pg_statistic WHERE ctid ='(46,9)';
- 重复执行步骤3、步骤4,直到全部有问题的数据记录被删除。
- 损坏的数据行被删除后,执行步骤2中的REINDEX和VACUUM ANALYZE操作对该表重新进行修复。