将大型 .sql 文件导入 Postgres

Phi*_*795 8 postgresql ubuntu

我需要导入一个大型数据转储。

结构已经创建。但是数据转储是 16GB 大。

如果我尝试简单

psql -d "DATABASE" < "datadump.sql"
Run Code Online (Sandbox Code Playgroud)

out of memory在 Ubuntu DB 上收到一条消息。

我不知道如何导入。

DB-Server 有 16GB 内存,50GB 可用磁盘空间(它是一个开发者虚拟机)

有谁知道如何导入这个文件?


更新

我的 postgresql.conf

# - Memory -

shared_buffers = 4GB            # min 128kB
                    # (change requires restart)
work_mem = 1048kB           # min 64kB
maintenance_work_mem = 2GB      # min 1MB


checkpoint_segments = 128       # in logfile segments, min 1, 16MB each
#checkpoint_timeout = 5min      # range 30s-1h
checkpoint_completion_target = 0.9  # checkpoint target duration, 0.0 - 1.0
#checkpoint_warning = 30s       # 0 disables


#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------
# - Planner Cost Constants -
effective_cache_size = 12GB

wal_buffers = 16MB
Run Code Online (Sandbox Code Playgroud)

插入是单行的,并且全部用于一张表。该表有 71 列。

我不知道,第 1447540 行是什么。没有 Texteditor 可以打开此文件 -.- (但文件的内容是正确的。将文件拆分为更小的文件后,导入运行成功。)

第一个屏幕截图显示了free -ht导入前的输出。第二个屏幕截图是在out of memory消息出现前 2 秒拍摄的。

在此处输入图片说明

在此处输入图片说明

pie*_*rop 3

很明显,该问题与 相关stdin.sql如果您可以控制转储过程,一个可能的解决方案是不执行psql. 为此,您只需运行以下两个查询:

  1. 从原始数据库执行此操作:COPY (SELECT * FROM mytable WHERE ...) TO '/storage/mytable.dump'
  2. 从目标数据库(出现内存不足问题的数据库)执行此操作:CREATE TABLE mynewtable ( ... ); COPY mynewtable FROM '/storage/mytable.dump';

您可以随意使用 中可用的各种参数COPY。例如,您可以导出带有标题和自定义分隔符的 gzip 压缩文件或 CSV:https://www.postgresql.org/docs/current/static/sql-copy.html

您还可以发出 apg_dumpall > /storage/db.out来导出整个原始数据库并运行psql -f /storage/db.out postgres以在新数据库上重新创建它:https://www.postgresql.org/docs/current/static/app-pg-dumpall.html。这应该可以工作..我刚刚在 OS X(类似 Linux)上转储了一个几十 GB 的输出文件,没有任何问题。

pg_dump可以选择更具选择性的数据库转储选项:https://www.postgresql.org/docs/current/static/app-pgdump.html