文档首页/ 数据仓库服务 GaussDB(DWS)/ 故障排除/ 数据库使用/ 查询表报错:missing chunk number %d for toast value %u in pg_toast_XXXX
更新时间:2024-07-01 GMT+08:00

查询表报错: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进行替换。

处理方法

  1. 通过toast的OID(示例中为2619,来源于报错信息的pg_toast_2619)查询出哪张表发生了损坏:

    1
    2
    3
    4
    5
    SELECT 2619::regclass;
       regclass
    --------------
     pg_statistic
    (1 row)
    

  2. 对已定位的损坏表(步骤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;
    

  3. 执行以下的命令定位该表中损坏的数据行。

     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
    

  4. 步骤3中定位的损坏数据行记录删除。

    1
    DELETE FROM pg_statistic WHERE ctid ='(46,9)';
    

  5. 重复执行步骤3步骤4,直到全部有问题的数据记录被删除。
  6. 损坏的数据行被删除后,执行步骤2中的REINDEX和VACUUM ANALYZE操作对该表重新进行修复。