【发布时间】:2018-02-10 20:33:29
【问题描述】:
我正在处理具有 700+ 百万行的单个表(没有分区)。我想将此数据加载到另一个数据库,所以我使用了以下 pg_dump 命令,
pg_dump -Fc --column-inserts --data-only --table='tname' -U
postgres -d dbname > /root/tname_experiment_inserts_custom_format.dump
在目标系统上我使用了以下命令,
pg_restore -d dest_dbname -U postgres -j 7 /root/tname_experiment_inserts_custom_format.dump
目标数据库已经有我试图恢复的表,所以我使用了 TRUNCATE,然后删除了所有索引。目标系统有 32GB 物理内存,我在 postgres 配置文件中做了如下设置,
log_min_duration_statement = -1
autovacuum = off
maintenance_work_memory = 7gb
wal_level = minimal
fsync = off
full_page_writes= off
synchronous_commit= off
max_wal_size= 20GB
wal_buffers= 16MB
当我为 pg_restore 计时时,一个小时内只有大约 1600 万行被插入。这意味着恢复数据需要 40 多个小时 (!)。之后,我必须创建我删除的索引和外部约束,这可能需要几个小时。我有一种感觉,我可以做一些不同的事情来使整个过程更快。请给我任何可以帮助我提高此过程效率的指示。我还想提一下,我已经看过 COPY 但因为它不保持主键的顺序,所以这个选项对我不利。如果我不知道保留数据顺序的 COPY 的任何特殊设置,那么很高兴知道!
整个事情的目的是更改列的某些数据类型,当使用 alter table alter column query 完成时,这些数据类型也需要类似的时间。
【问题讨论】:
-
省略
--column-inserts -
@wildplasser 非常感谢您的回复。我可以知道pg_dump中的--column-inserts减慢pg_restore的原因吗?请随时向我指出相关文档。 (不在办公室,所以无法早点回复)
-
其实用--data-only 是不是和“copy”一样?如果是这样,那么它将不会维护键的顺序,然后依赖于该表的另一个表将需要手动修改。就像我说的,我只想修改一个表,而许多其他表不会被触及。我只是在还原之前删除外部约束并将它们添加回来,因此键顺序对我来说很重要。
-
注:没有顺序。任何订单都有效。
标签: postgresql pg-dump pg-restore