POSTGRESQL:没有TOAST数据的DUMP表

时间:2012-06-21 03:07:09

标签: postgresql

我正在尝试从表中隔离Toast数据,这样我就可以在没有toast数据的情况下转储表。我知道必须有办法做到这一点,但我无法到达那里......建议将受到高度赞赏

2 个答案:

答案 0 :(得分:1)

使用查询选项尝试COPY(或psql的\ copy) - 您可以选择要导出的列。您也可以选择CSV格式而不是制表符分隔,空值的表示等。

答案 1 :(得分:0)

TOAST是PostgreSQL在内部存储数据的方式。对于您而言,作为用户,只有您委派给数据库的值才能保留给您。

TOAST主要用于文本数据,当任何元组的属性使元组的大小超过8k时(如果PostgreSQL使用默认页面大小编译)。这发生在数据库引擎内部,对用户透明。比如说,如果你要插入一个带有圆形10k符号的文本的行,相应的属性将被TOAST。

鉴于TOAST如何工作,您的问题看起来像:如何在没有包含大块数据的属性的情况下转储表?我似乎不清楚这是什么目的,因为你的转储将不完整。


编辑:我不知道如何查找任何元组的任何属性是否具有TOASTed值。相反,我将消除可以具有 TOASTed值的所有属性。

以下查询将为您提供表格的所有列,这些列始终位于PLAIN存储模式中:

SELECT a.attname
  FROM pg_class t
  JOIN pg_attribute a ON t.oid = a.attrelid
  JOIN pg_type typ ON typ.oid = a.atttypid
 WHERE t.relkind='r' AND t.relname = 'element'
   AND a.attnum > 0 AND NOT a.attisdropped
   AND typ.typstorage='p'
 ORDER BY a.attnum;

此查询将生成所需的SQL,您可以将其包装在脚本中或PL / pgSQL的EXECUTE语句中:

SELECT 'COPY '||quote_ident(t.relname)||
       '('||string_agg(a.attname, ',' ORDER BY a.attnum)||') TO stdout;'
  FROM pg_class t
  JOIN pg_attribute a ON t.oid = a.attrelid
  JOIN pg_type typ ON typ.oid = a.atttypid
 WHERE t.relkind='r' AND t.relname = '<YOUR_TABLE>'
   AND a.attnum > 0 AND NOT a.attisdropped
   AND typ.typstorage='p'
 GROUP BY t.relname;