
# 查询表报错：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（超尺寸字段存储技术）的缩写，是超长字段在DWS的一种存储方式。当某表中有超长字段的时候，那么该表会有与之相关联的toast表。根据toast表的命名规则，假设存在表名为test的OID为2619，那么如果存在与之相关联的toast表，则toast表名为pg_toast_2619。此报错中pg_toast_2619非固定表名，可根据实际报错对pg_toast_2619进行替换。
#### 处理方法
1. 通过toast的OID（示例中为2619，来源于报错信息的pg_toast_2619）查询出哪张表发生了损坏：
   
   ```
   SELECT 2619::regclass;
      regclass
   --------------
    pg_statistic
   (1 row)
   ```
   
   
2. 对已定位的损坏表（[步骤1]中查询得到的表pg_statistic），执行REINDEX和VACUUM ANALYZE操作。显示REINDEX/VACUUM，表示修复完成。如果修复过程中出现报错，请继续执行[步骤3]。
   
   ```
   REINDEX table pg_toast.pg_toast_2619;
   REINDEX table pg_statistic;
   VACUUM ANALYZE pg_statistic;
   ```
   
   
3. 执行以下的命令定位该表中损坏的数据行。
   
   ```
   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]中定位的损坏数据行记录删除。
   
   ```
   DELETE FROM pg_statistic WHERE ctid ='(46,9)';
   ```
   
   
5. 重复执行[步骤3]、[步骤4]，直到全部有问题的数据记录被删除。
6. 损坏的数据行被删除后，执行[步骤2]中的REINDEX和VACUUM ANALYZE操作对该表重新进行修复。
 
