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