小编nul*_*ptr的帖子

pg_使用 -j 选项恢复非常大的单个表需要几个小时

我正在处理一个包含 700 多百万行的表(没有分区)。我想将此数据加载到另一个数据库,因此我使用了以下 pg_dump 命令,

pg_dump -Fc --column-inserts --data-only --table='tname' -U 
postgres -d dbname > /root/tname_experiment_inserts_custom_format.dump
Run Code Online (Sandbox Code Playgroud)

在目标系统上我使用了以下命令,

pg_restore -d dest_dbname -U postgres -j 7 /root/tname_experiment_inserts_custom_format.dump
Run Code Online (Sandbox Code Playgroud)

目标数据库已经有我尝试恢复的表,因此我使用 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
Run Code Online (Sandbox Code Playgroud)

当我对 pg_restore 进行计时时,一个小时内仅插入了大约 1600 万行。这意味着恢复数据需要 40 多个小时 (!)。之后,我必须创建我删除的索引和外部约束,这可能还需要几个小时。我有一种感觉,我可以做一些不同的事情,让整个过程更快。请给我任何可以帮助我提高这个过程效率的指示。我还想提一下,我已经看过 COPY,但因为它不维护主键的顺序,所以这个选项对我来说不好。如果我不知道 COPY 的任何特殊设置可以保留数据的顺序,那么很高兴知道!

整个事情的目的是更改列的某些数据类型,当使用 alter table alter columns 查询完成时,也花费了类似的时间。

postgresql pg-dump pg-restore

5
推荐指数
1
解决办法
3254
查看次数

标签 统计

pg-dump ×1

pg-restore ×1

postgresql ×1