我需要导入一个大型数据转储。
结构已经创建。但是数据转储是 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 秒拍摄的。
很明显,该问题与 相关stdin
。.sql
如果您可以控制转储过程,一个可能的解决方案是不执行psql
. 为此,您只需运行以下两个查询:
COPY (SELECT * FROM mytable WHERE ...) TO '/storage/mytable.dump'
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